C. Find B

原题链接

题解

给定数组c,和若干查询区间,请问能否改变区间中的每一个值且区间和还不变?

对于任意一个数,不是加就是减,而对于整个数组而言,加了多少就要减多少
而对于等于1的元素而言,只能加,因此我们令元素为1的为待加元素,其他元素均为待减元素
找出所有大于1的元素把他们变成一,然后差值累加到一个变量sum里
再判断1的个数k,看看sum能否补齐k的缺口,即sum>=k
如果k=0,即没有待加元素,但是指定任意一个元素为待加元素
那就判断区间大小是否大于等于2,即加和减的元素至少各有一个

code

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

ll pres[300005]={0};
ll add[300005]={0};

inline void read(ll &x) {  
    x = 0;
    ll flag = 1;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c == '-')flag = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = (x << 3) + (x << 1) + (c ^ 48); 
        c = getchar();
    }
    x *= flag;
}

inline void write(ll x)
{
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9) 
        write(x / 10);
    putchar(x % 10 + '0');
}

int main()
{
    ll t;
    read(t);
    while(t--)
    {
        ll n,q;
        read(n); read(q);
        for(ll i=1;i<=n;i++)
        {
            ll x;
            read(x);
            pres[i]=pres[i-1]+x-1;//区间和
            add[i]=add[i-1]+(x==1);//区间1的个数
        }
        while(q--)
        {
            ll x,y;
            read(x); read(y);
            ll k=add[y]-add[x-1],sum=pres[y]-pres[x-1];
            if(k&&sum>=k||!k&&y-x+1>=2) puts("YES");
            else puts("NO");
        }
    }
    return 0;
}

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