题解
给定数组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;
}
标签:read,sum,元素,Find,while,区间,ll
From: https://www.cnblogs.com/pure4knowledge/p/18041118