CF1861C Queries for the Array

· · 题解

思路

机翻害人,我还以为是 10 是对原序列排序,害得我比赛的时候都没对,恼。

首先,对于新加入的数字,我们可以先不确定是否有序,而是等到后续的 10 出现,再确定。

num 表示目前有多少数字,用 so 表示确定有序的数字中最后一位的位置,nso 表示确定无序的第一位数字的位置。

那么,我们可以分几种情况讨论:

AC code

#include<bits/stdc++.h>
using namespace std;
int T,n,num,so,flag,nso;
char ch[200005];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",ch+1),n=strlen(ch+1),nso=num=so=flag=0;
        for(int i=1;i<=n;++i)
        {
            if(ch[i]=='+') ++num;
            if(ch[i]=='-') --num,nso=(num<nso)?0:nso,so=min(so,num);
            if(ch[i]=='1')
            {
                if(nso){flag=1;break;}
                so=num;
            }
            if(ch[i]=='0')
            {
                if(num<2||so==num){flag=1;break;}
                if(!nso) nso=num;
            }
        }
        if(flag) printf("NO\n");
        else printf("YES\n");
    }
    return 0;
}