题解:P11272 「Diligent-OI R1 B」DlgtArray

· · 题解

特判的点较多,要注意。

首先,不难想到用前缀和来维护区间和。

其次的点:

  1. 如果只有一个数且 k 是大于零的,输出无解。

  2. 如果只有一个数且 k 是等于零的,无需操作。

  3. 如果 k 比区间长还大,输出无解。

  4. 如果已经满足条件,无需操作。

  5. 最后在判一下乘积,再直接搞即可。

具体见代码:

#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;
}