D. Ones and Twos

原题链接

题解

先考虑操作一,首先要数组总和不小于 s
其次,我们可以通过两边删数来得到子数组,如果两边任一边有二,我们删掉二之后, sum 减二,如果全是一,我们两边的一都删掉(数组长度大于1), sum 减二,所以如果 sum 是偶数,那么我一定能得到 [2,sum] 内的所有偶数;奇数同理,可以得到 [1,sum] 内的所有奇数,这样的操作让我们想到:维护每次更改之后的最大奇数区间和和最大偶数区间和

实施

用集合维护奇数的个数和位置

code

#include<bits/stdc++.h>
using namespace std;

int a[100005];
int main()
{
    int t;
    cin>>t;

    while(t--)
    {
        int n,q;
        cin>>n>>q;

        set<int> pos;
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sum+=a[i];
            if(a[i]==1) pos.insert(i);
        }

        while(q--)
        {
            int op;
            cin>>op;

            if(op==1)
            {
                int s;
                cin>>s;

                int len=pos.size();
                //printf("sum1:  %d\n",sum);
                if(len==0)
                {
                    if(s%2==sum%2) puts("yes");
                    else puts("no");
                    continue;
                }
                //printf("maxs:%d  mins:%d  size:%d\n",*pos.rbegin(),*pos.begin(),len);
                int sum1=2*(*pos.rbegin()-len)+len-1;
                int sum2=2*(n-*pos.begin()+1)-len-1;


                //printf("sum2: %d\nsum3: %d\n",sum1,sum2);

                if(s%2==sum%2)
                {
                    if(s<=sum) puts("yes");
                    else puts("no");
                }
                else
                {
                    if(s<=max(sum1,sum2)) puts("yes");
                    else puts("no");
                }
            }
            else
            {
                int id,v;
                cin>>id>>v;

                if(v==1)
                {
                    if(a[id]==2)
                    {
                        pos.insert(id);
                        sum--;
                    }
                    a[id]=1;
                }
                else
                {
                    if(a[id]==1)
                    {
                        pos.erase(id);
                        sum++;
                    }
                    a[id]=2;
                }
            }
        }

    }
    return 0;
}

posted @   纯粹的  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示