分块,TLE最后三个,求助
查看原帖
分块,TLE最后三个,求助
279095
gargantuar楼主2021/5/31 11:45

RT

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,m,ll[100086],rr[100086],bl[100086],val[100086],sum[1024],mark[1024];
long long k,x,y,c3;
void add() {
	if(bl[x]=bl[y]){
		for(long long i=x;i<=y;i++)
			val[i]+=c3,sum[bl[x]]+=c3;
		return;
	}
	for(long long j=bl[x]; j<=bl[y]; j++) { 
		if(j==bl[x]){
			for(long long i=x;i<=rr[j];i++)val[i]+=c3,sum[bl[x]]+=c3;
		}else if(j==bl[y]){
			for(long long i=ll[j];i<=y;i++)val[i]+=c3,sum[bl[y]]+=c3;
		}else {
			mark[j]+=c3;
		}
	}
}
long long find() {
	long long ans=0;
	if(bl[x]=bl[y]){
		for(long long i=x;i<=y;i++)
			ans+=val[i]+mark[bl[x]];
		return ans;
	}
	for(long long j=bl[x]; j<=bl[y]; j++) { 
		if(j==bl[x]){
			for(long long i=x;i<=rr[j];i++)ans+=val[i]+mark[j];
		}else if(j==bl[y]){
			for(long long i=ll[j];i<=y;i++)ans+=val[i]+mark[j];
		}else {
			ans+=sum[j]+mark[j]*(rr[j]-ll[j]+1);
		}
	}
	return ans;
}
int main() {
	scanf("%d%d",&n,&m);
	long long sq=sqrt(n);
	for(long long i=1; i<=sq; i++) {
		ll[i]=sq*(i-1)+1;
		rr[i]=sq*i;
	}
	ll[sq]=n;
	for(long long i=1; i<=n; i++)bl[i]=(i-1)/sq+1;
	for(long long i=1; i<=n; i++) {
		scanf("%d",&val[i]);
		sum[bl[i]]+=val[i];
	}
	for(long long i=1; i<=m; i++) {
		scanf("%d%d%d",&k,&x,&y);
		if(k==1) {
			scanf("%d",&c3);
			add();
		}else{
			printf("%d\n",find());
		}
	}
	return 0;
}
2021/5/31 11:45
加载中...