查询为 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;
}