题目链接:题目
大意:
把一个数列的某个区间改为k后数列之和是否为奇数。
思路:
这道题涉及对一个固定的数组的不同区间进行多次查找,不由得让人想到了前缀和。为什么能用呢?因为所谓求奇数还是偶数都要先求出和,不过可以把奇数都简化为1,偶数为0。(注意前缀和数组a[0]=0,且当a[i]=0时不要忘了a[i]=a[i-1],区间是a[r]-a[l-1])
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MOD 1000000007
#define fi first
#define se second
#define pii pair<int,int>
#define vec vector
int solve(int n,int q,vec<int> a){
for(int i=1;i<=n;i++){
if(a[i]%2==0)a[i]=0;
else a[i]=1;
}
a[0]=0;
for(int i=1;i<=n;i++){
if(a[i]==1)a[i]=a[i-1]+1;
else a[i]=a[i-1];
}
while(q--){
int l,r,k;
cin>>l>>r>>k;
int sum=a[n];
k=k%2!=0;
sum-=a[r]-a[l-1];
sum+=(l-r+1)*k;
if(sum%2==0)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return 0;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--){
int n,q;
cin>>n>>q;
vec<int> a(n+1);
for(int i=1;i<=n;i++)cin>>a[i];
solve(n,q,a);
}
return 0;
}