思路不知道有什么问题,test3 666 行错误,求hack
查看原帖
思路不知道有什么问题,test3 666 行错误,求hack
450743
XOOR楼主2023/10/9 17:11

查询为 0 ,加数的时候只需要有一个是乱序即可,算出这段增加的个数,减去减掉的个数,最终剩余的都加入到正序的数字中

查询为 1 ,加数如果有乱序的数字,乱序的数字增加 1 , 否则正确顺序的数字增加,减数优先减乱序数字,没有乱序数字再减正确顺序数字

没过qwq ,求hack

#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
const int N=2e5+10;

int T;
int vis[N];
string s;

void solve(){
	cin>>s;
	for(int i=0;i<=s.size();i++) vis[i]=0;
	int rt=1,fs=0;
	if(s[0]=='0'){
		puts("NO");
		return ;
	}
	if(s[0]=='1')
		rt=0;
	int opt=-1;
	for(int i=s.size()-1;i>=0;i--){
		if(s[i]=='0') opt=0;
		if(s[i]=='1') opt=1;
		vis[i]=opt;
	}
	int p=0;
	bool f=1;
	int d=0;
	for(int i=1;i<s.size();i++){
		if(vis[i]==-1) break ;
		else if(s[i]=='+'){
			if(vis[i]==1){
				if(!fs) rt++;
				else fs++;
			}else d++;
		}else if(s[i]=='-'){
			if(d) d--;
			else if(fs) fs--;
			else rt--;
		}else if(s[i]=='0'){
			if(d){
				rt+=d-1;
				fs++;
			}
			if(!(fs+d) || fs+rt<2){f=0;break ;}
			d=0;
		}
		else{
			d=0;
			if(fs){f=0;break ;}
		}	
	}
	if(f) puts("YES");
	else puts("NO");
	return ;
}

int main(){
	scanf("%d",&T);
	while(T--) solve();
	return 0;
}
2023/10/9 17:11
加载中...