CF 1896 D

发布时间 2023-12-20 02:11:59作者: ycllz

https://codeforces.com/contest/1896/problem/D
首先我们要发现一个性质就是
要是我们能凑出为S的 那一定能凑出S-2的
询问的时候和总的同奇偶就可以随便缩一下
要是不同奇偶我们就得找到最左最右的1来改变奇偶
用set维护1的位置即可

void solve(){
    int n,q;cin>>n>>q;
    vector<int>a(n+1);
    set<int>st;
    int sum=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]==1)st.insert(i);
        sum+=a[i];
    }
    while(q--){
        int op;cin>>op;
        if(op==1){
            int x;cin>>x;
            if(x%2==sum%2){
                if(sum>=x)YES
                else NO
            }else{
                if(st.size()){
                    auto itl=*st.begin();
                    auto itr=*st.rbegin();
                    if(sum-1-(itl-1)*2>=x || sum-1-(n-itr)*2>=x){
                        YES
                    }else NO
                }else NO
            }
        }else{
            int pos,x;cin>>pos>>x;
            sum-=a[pos];
            if(a[pos]==1)st.erase(pos);
            a[pos]=x;
            sum+=a[pos];
            if(a[pos]==1)st.insert(pos);
        }
    }
}