求助分块,本地过了
查看原帖
求助分块,本地过了
372780
Starw楼主2021/12/17 13:26

代码:

#include<bits/stdc++.h>
using namespace std;
int b[505][505],sum[505],rt[505],s[505],id[100005],Len,N;
inline void add(int l,int r,int x){
	int L=l%Len,R=r%Len,lid=id[l],rid=id[r];
	L=((!L)?Len:L),R=((!R)?Len:R);
	if(lid==rid){
		for(int i=L;i<=R;i++)
			b[lid][i]+=(i-L+1)*x;
		for(int i=R+1;i<=s[lid];i++)
			b[lid][i]+=(R-L+1)*x;
	}else{
		for(int i=L;i<=s[lid];i++)
			b[lid][i]+=(i-L+1)*x;
		for(int i=1;i<=R;i++)
			b[rid][i]+=i*x;
		for(int i=R+1;i<=s[rid];i++)
			b[rid][i]+=R*x;
		for(int i=lid+1;i<=rid-1;i++)
			sum[i]+=(i-lid)*x,rt[i]+=x;
		for(int i=rid;i<=N;i++)
			sum[i]+=(rid-lid-1)*x;
	}
}
inline int qry(int l,int r){
	int L=l%Len,R=r%Len,lid=id[l],rid=id[r];
	L=((!L)?Len:L),R=((!R)?Len:R);
	if(lid==rid)return b[lid][R]-b[lid][L-1];
	else return sum[rid-1]-sum[lid]+b[rid][R]+rt[rid]*R+(b[lid][s[lid]]-b[lid][L-1]+rt[rid]*(s[lid]-L+1));
}
int main(){
	int n,m,len(0),p(1),Sum(0);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		b[p][++len]=x+b[p][len-1],Sum+=x,id[i]=p;
		if(len*len>=n)s[p]=len,sum[p]=sum[p-1]+Sum,Sum=len=0,p++;
	}
	s[p]=len,sum[p]=sum[p-1]+Sum,Sum=len=0,Len=s[1],N=p;
	while(m--){
		int op,l,r,x;
		scanf("%d",&op);
		if(op&1){
			scanf("%d%d%d",&l,&r,&x);
			add(l,r,x);
		}else{
			scanf("%d%d",&l,&r);
			printf("%d\n",qry(l,r));
		}
	}
    return 0;
}
2021/12/17 13:26
加载中...