MX刚学oi一秒,求助分块
查看原帖
MX刚学oi一秒,求助分块
241817
Chancylaser楼主2021/9/21 14:23
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
long long n,m;
const long long M = 100005;
long long dx[M];
long long l[M],r[M];
long long a[M];
long long belong[M];
long long lazy[M];
long long bg,sum;
inline long long read()
{
	long long x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
void buildd(){
	bg=sqrt(n);
	sum=n/bg;
	if(n%bg)
		sum++;
	for(int i=1;i<=sum;i++)
		l[i]=(i-1)*bg+1,r[i]=i*bg;
	r[sum]=n;
	for(int i=1;i<=n;i++)
		belong[i]=(i-1)/bg+1;
	for(int i=1;i<=sum;i++)
		for(int j=l[i];j<=r[i];j++)
			dx[i]+=a[j];
	return;
}
inline void updata(long long x,long long y,long long k){
	if(belong[x]==belong[y]){
		if(x==l[belong[x]]&&y==r[belong[y]]){
			lazy[belong[x]]+=k;
			return;
		}
		for(int i=x;i<=y;i++)
			a[i]+=k;
		dx[belong[x]]+=(y-x+1)*k;
	}
	else{
		if(x!=l[belong[x]]){
			for(int i=x;i<=r[belong[x]];i++)
				a[i]+=k;
			dx[belong[x]]+=(r[belong[x]]-x+1)*k;				
		}
		else
			lazy[belong[x]]+=k;
		for(int i=belong[x]+1;i<=belong[y]-1;i++)
			lazy[i]+=k;
		if(y!=r[belong[y]]){
			for(int i=l[belong[y]];i<=y;i++)
				a[i]+=k;
			dx[belong[y]]+=(y-l[belong[y]]+1)*k;
		}
		else
			lazy[belong[y]]+=k;
	}
	return;
}
long long query(long long x,long long y){
	long long ans=0;
	if(belong[x]==belong[y]){
		for(int i=x;i<=y;i++)
			ans+=a[i];
	}
	else{
		for(int i=x;i<=r[belong[x]];i++)
			ans+=a[i];
		if(lazy[belong[x]])
			ans+=(r[belong[x]]-x+1)*lazy[belong[x]];
		for(int i=belong[x]+1;i<=belong[y]-1;i++){
			ans+=dx[i];
			if(lazy[belong[i]])
				ans+=(r[i]-l[i]+1)*lazy[i];
		}
		for(int i=l[belong[y]];i<=y;i++)
			ans+=a[i];
		if(lazy[belong[y]])
			ans+=(y-l[belong[y]]+1)*lazy[belong[y]];
	}
	return ans;
}
int main(){
	//freopen("P3372_8.in","r",stdin);
	//freopen("P3372_8.out","w",stdout);
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		a[i]=read();
	buildd();
	long long qqq;
	for(int i=1;i<=m;i++){
		qqq=read();
		if(qqq==1){
			long long x,y,k;
			x=read(),y=read(),k=read();
			updata(x,y,k);
		}
		if(qqq==2){
			long long wh,jjj;
			wh=read(),jjj=read();
			printf("%lld\n",query(wh,jjj));
		}
	}
	return 0;
}

只过了3个点,是不是哪里写错了有大佬帮蒟蒻看看咩

2021/9/21 14:23
加载中...