题解:P11272 「Diligent-OI R1 B」DlgtArray
特判的点较多,要注意。
首先,不难想到用前缀和来维护区间和。
其次的点:
-
如果只有一个数且
k 是大于零的,输出无解。 -
如果只有一个数且
k 是等于零的,无需操作。 -
如果
k 比区间长还大,输出无解。 -
如果已经满足条件,无需操作。
-
最后在判一下乘积,再直接搞即可。
具体见代码:
#include<bits/stdc++.h>
using namespace std;
int n,q,a[10000005],b[10000005];//b是前缀和
int l,r,k;
int main(){
ios::sync_with_stdio(false);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
b[i]=a[i]+b[i-1];
}
while(q--){
cin>>r>>l>>k;
if(l-r==0&&k!=0){
cout<<-1<<endl;
continue;
}
if(l-r==0&&k==0){
cout<<0<<endl;
continue;
}
if(k>l-r){
cout<<-1<<endl;
continue;
}
int xans=b[l]-b[r-1];
int xch;
if(xans-(l-r+1)==0){//乘积
xch=1;
}
else{
xch=0;
}
if(xans==xch+k){
cout<<0<<endl;
continue;
}
if(xch==0){
int minn;
minn=abs(k-xans);
cout<<minn<<endl;
}
if(xch==1){
cout<<abs(k-xans)<<endl;
}
}
return 0;
}