80分,最后一个点,求助大佬
查看原帖
80分,最后一个点,求助大佬
370305
liyuhangyyds楼主2021/8/11 11:37
#include<bits/stdc++.h>
using namespace std;
long long c1[200001],c2[200001],a[200001],d[200001],n,m,cz,x,y,k,wz;
int lowbit(int x){
	return x&(-x);
}
void updata(int x,int k){
	for(int i=x;i<=n;i+=lowbit(i)){
		c1[i]+=k;
		c2[i]+=1ll*k*x;
	}
}
long long int getsum(int x){
	long long int ans=0;
	while(x){
		ans+=c1[x];
		x-=lowbit(x);
	}
	return ans;
}
long long int getsum2(int x){
	long long int ans=0;
	while(x){
		ans+=c2[x];
		x-=lowbit(x);
	}
	return ans;
}
long long int Getsum(int x){
	long long int ans=getsum(x);
	ans*=(x+1);
	return ans-getsum2(x);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]); 
		d[i]=a[i]-a[i-1];
		updata(i,d[i]);
    }
    for(int i=1;i<=m;i++){
	    cin>>cz;
	    if(cz==1){
			scanf("%d%d%d",&x,&y,&k); 
	    	updata(x,k);
	    	updata(y+1,-k);
		}
	    if(cz==2){
	    	scanf("%d",&k);
	    	updata(1,k);
	    	updata(2,-k);
		}
	    if(cz==3){
	    	scanf("%d",&k);
	    	updata(1,-k);
	    	updata(2,k);
		}
	    if(cz==4){
	    	scanf("%d%d",&x,&y);
	    	printf("%lld\n",Getsum(y)-Getsum(x-1));
		}
	    if(cz==5){
	    	printf("%lld\n",getsum(1));
		}
	}
	return 0;
}

求助大佬

2021/8/11 11:37
加载中...