分块0分,求调
查看原帖
分块0分,求调
777854
Patrickpanpan楼主2024/7/21 20:28
#include<bits/stdc++.h>
using namespace std;
int a[2000010];
int n,m;
int len;
long long ans[2000010];
long long lazy[2000010];
int get(int x)
{
	return x/len;
}
int main()
{
	cin>>n>>m;
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		ans[get(i)]+=a[i];
	}
	for(int apple=1;apple<=m;apple++)
	{
		int mode;
		cin>>mode;
		if(mode==1)
		{
			int l,r,k;
			cin>>l>>r>>k;
			if(get(l)==get(r))
			{
				for(int i=l;i<=r;i++)
				{
					a[i]+=k;
				}
			}
			else
			{
				int lx=l;
				int rx=r;
				while(get(lx)==get(l))
				{
					a[lx]+=k;
					ans[get(lx)]+=k;
					lx+=1;
				} 
				while(get(rx)==get(r))
				{
					a[rx]+=k;
					ans[get(rx)]+=k;
					rx-=1;
				}
				for(int i=get(lx);i<=get(rx);i++)
				{
					ans[i]+=k*len;
					lazy[i]+=k;
				}
			}
		}
		if(mode==2)
		{
			int k;
			cin>>k;
			a[1]+=k;
			ans[get(1)]+=k;
		}
		if(mode==3)
		{
			int k;
			cin>>k;
			a[1]-=k;
			ans[get(1)]-=k;
		} 
		if(mode==4)
		{
			int l,r;
			cin>>l>>r;
			long long res=0;
			if(get(l)==get(r))
			{
				for(int i=l;i<=r;i++)
				{
					res+=(a[i]+lazy[get(i)]);
				}
			}
			else
			{
				int lx=l;
				int rx=r;
				while(get(lx)==get(l))
				{
					res+=(a[lx]+lazy[get(lx)]);
					lx+=1;
				} 
				while(get(rx)==get(r))
				{
					res+=(a[rx]+lazy[get(rx)]);
					rx-=1;
				}
				for(int i=get(lx);i<=get(rx);i++)
				{
					res+=ans[i];
				}
			}
			cout<<res<<endl;
		}
		if(mode==5)
		{
			cout<<a[1]+lazy[get(1)]<<endl;
		}
	}
	return 0;
}
2024/7/21 20:28
加载中...