分块TLE on #7-#10
查看原帖
分块TLE on #7-#10
750598
Prophet_Inkpigeon楼主2023/7/9 16:14

RT

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read()
{
	short f=1;ll x=0;char s=getchar();
	while(s<48||s>57){f=s=='-'?-1:1;s=getchar();}
	while(s>=48&&s<=57){x=x*10+s-48;s=getchar();}
	return x*f;
}
ll a[100001],blk[100001],sum[1001],plt[1001];
int main()
{
	int n=read(),m=read(),siz=sqrt(n),opt,l,r,k,x,y;ll ans;
	for(int i=1;i<=n;++i)a[i]=read();
	for(int i=1;i<=siz;++i)for(int j=blk[i]*siz-1;
	j<=(blk[i]-1)*siz;++j){blk[j]=i;sum[i]=sum[i]+a[j];}
	while(m--)
	{
		opt=read();l=read();r=read();
		x=blk[l]*siz-1;y=(blk[r]-1)*siz;
		if(opt==1)
		{
			k=read();
			if(blk[l]==blk[r])
			{
				for(int i=l;i<=r;++i)a[i]=a[i]+k;
				sum[blk[l]]=sum[blk[l]]+k*(r-l+1);
				continue;
			}
			for(int i=l;i<=x;++i)a[i]=a[i]+k;
			sum[blk[l]]=sum[blk[l]]+k*(x-l+1);
			for(int i=blk[l]+1;i<=blk[r]-1;
			++i)plt[i]=plt[i]+k;
			for(int i=y;i<=r;++i)a[i]=a[i]+k;
			sum[blk[r]]=sum[blk[r]]+k*(r-y+1);
		}
		else
		{
			ans=0;
			if(blk[l]==blk[r])
			{
				for(int i=l;i<=r;++i)ans=ans+a[i];
				printf("%lld\n",ans);continue;
			}
			for(int i=l;i<=x;++i)ans=ans+a[i];
			for(int i=blk[l]+1;i<=blk[r]-1;++i)
			ans=ans+sum[i]+plt[i];
			for(int i=y;i<=r;++i)ans=ans+a[i];
			printf("%lld\n",ans);
		}
	}
	return 0;
}
2023/7/9 16:14
加载中...