分块80分,TLE最后一个点,蒟蒻求调
  • 板块P2357 守墓人
  • 楼主GalwayGirl
  • 当前回复15
  • 已保存回复15
  • 发布时间2022/7/4 10:14
  • 上次更新2023/10/27 21:56:18
查看原帖
分块80分,TLE最后一个点,蒟蒻求调
327295
GalwayGirl楼主2022/7/4 10:14
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[210000],sum[210000],belong[210000],L[210000],R[210000],add[210000],t,l,op,r,k;
inline int read()
{
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
void change(int l,int r,int d)
{
	int p=belong[l],q=belong[r];
	if(p==q)
	{
		for(int i=l;i<=r;i++)a[i]+=d;
		sum[p]+=(r-l+1)*d;
		return;
	}
	for(int i=l;i<=R[p];i++)a[i]+=d;
	sum[p]+=(R[p]-l+1)*d;
	for(int i=L[q];i<=r;i++)a[i]+=d;
	sum[q]+=(r-L[q]+1)*d;	
	for(int i=p+1;i<q;i++)add[i]+=d;
}
long long ask(int l,int r)
{
	long long ans=0;
	int p=belong[l],q=belong[r];
	if(p==q)
	{
		for(int i=l;i<=r;i++)ans+=a[i];
		return ans;
	}
	for(int i=l;i<=R[p];i++)ans+=a[i];
	for(int i=p+1;i<q;i++)ans+=sum[i]+add[i]*(R[i]-L[i]+1);
	for(int i=L[q];i<=r;i++)ans+=a[i];
	return ans;
}
int main()
{
	n=read();
	m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	t=sqrt(n);
	for(int i=2;i<=t;i++)
	{
		L[i]=R[i]+1;
		R[i]=L[i]+t-1;
	}
	if(t*t<n)
	{
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;i++)
	{
		for(int j=L[i];j<=R[i];j++)
		{
			belong[j]=i;
			sum[i]+=a[j];
		}
	}
	while(m--)
	{
		op=read();
		if(op==2||op==3)
		{
			k=read();
			if(op==3)k=-k;
			a[1]+=k;
			sum[1]+=k;
		}
		if(op==5)printf("%lld\n",a[1]);
		if(op==1)
		{
			l=read();
			r=read();
			k=read();
			change(l,r,k);
		}
		if(op==4)
		{
			l=read();
			r=read();
			printf("%lld\n",ask(l,r));
		} 
	}
	return 0;
}
2022/7/4 10:14
加载中...