分块求调 调了两个小时了
查看原帖
分块求调 调了两个小时了
212645
c0Nf1nUly楼主2021/7/24 17:19
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std; 
long long n,m,opt,x,y,k,t;
long long L[101000],R[101000],pos[101000],sum[101000],add[101000],a[101000]; 
int change(long long l,long long r,long long k){
	long long l_pos=pos[l];
	long long r_pos=pos[r];
	if(l_pos==r_pos){
		for(long long i=l;i<=r;i++){
			a[i]+=k;
		}
		sum[l_pos]=(long long)(r-l+1)*k;
	}
	else{
		for(long long i=l_pos+1;i<=r_pos-1;i++){
			add[i]+=k;
		}
		for(long long i=l;i<=R[l_pos];i++){
			a[i]+=k;
		}
		sum[l_pos]=(long long)(R[l_pos]-l+1)*k;
		for(long long i=L[r_pos];i<=r;i++){
			a[i]+=k;
		}
		sum[r_pos]=(long long)(r-L[r_pos]+1)*k; 
	}
}
int ask(long long l,long long r){
	long long ans=0; 
	long long l_pos=pos[l]; 
	long long r_pos=pos[r];
	if(l_pos==r_pos){
		for(int i=l;i<=r;i++){
			ans+=a[i];
		}
		ans+=add[l_pos]*(long long)(r-l+1);
	}
	else{
		for(long long i=l_pos+1;i<=r_pos-1;i++){
			ans+=sum[i]+add[i]*(long long)(R[i]-L[i]+1);
		}
		for(long long i=l;i<=R[l_pos];i++){
			ans+=a[i];
		}
		ans+=add[l_pos]*(long long)(R[l_pos]-l+1);
		for(long long i=L[r_pos];i<=r;i++){
			ans+=a[i];
		}
		ans+=add[r_pos]*(long long)(r-L[r_pos]+1);
	}
	return ans;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	t=sqrt(n);
	for(long long i=1;i<=t;i++){
		L[i]=(i-1)*sqrt(n)+1;
		R[i]=i*sqrt(n);      
	}
	if(R[t]<n){ 
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(long long i=1;i<=t;i++){
		for(int j=L[i];j<=R[i];j++){
			pos[j]=i; 
			sum[i]+=a[j]; 
		}
	}
	for(long long i=1;i<=m;i++){
		scanf("%lld",&opt);
		if(opt==1){
			scanf("%lld%lld%lld",&x,&y,&k);
			change(x,y,k);
		}
		else if(opt==2){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",ask(x,y));
		} 
	}
	return 0;
} 

RT

2021/7/24 17:19
加载中...