1 条题解

  • 0
    @ 2025-8-24 23:05:57

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar easy42
    无蓝钩不改签

    搬运于2025-08-24 23:05:57,当前版本为作者最后更新于2024-11-14 13:16:04,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    特判的点较多,要注意。

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

    其次的点:

    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;
    }
    
    • 1

    信息

    ID
    10915
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者