P2357,(写的像是分块的东西?),wa0分,求指正
  • 板块P2357 守墓人
  • 楼主_lzh
  • 当前回复1
  • 已保存回复1
  • 发布时间2020/8/16 21:11
  • 上次更新2023/11/6 20:06:01
查看原帖
P2357,(写的像是分块的东西?),wa0分,求指正
116173
_lzh楼主2020/8/16 21:11
#include<bits/stdc++.h>

using namespace std;

int block;
int b[200010];
unsigned long long lazy[200010];
unsigned long long a[200010],c[200010];
int l[200010],r[200010];
unsigned long long ans;
int n,f;

void build()
{
	block=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		b[i]=(i-1)/block+1;
	}
	for(int i=1;i<=n;i++)
	{
		c[b[i]]+=a[i];
		if(b[i]>b[i-1])
		{
			l[b[i]]=i;
			r[b[i-1]]=i-1;
		}
	}
}

unsigned long long query(int p,int q)
{
	ans=0;
	for(int i=p;i<=r[b[p]];i++)
	{
		ans+=a[i]+lazy[b[i]];
	}
	for(int i=b[p]+1;i<=b[q]-1;i++)
	{
		ans+=c[i]+lazy[i]*block;
	}
	for(int i=l[b[q]];i<=q;i++)
	{
		ans+=a[i]+lazy[b[i]];
	}
	return ans;
}
	
void update(int p,int q,int k)
{	
	for(int i=p;i<=r[b[p]];i++)
	{
		if(p==l[b[p]]&&l[b[p]+1]!=0)
		{
			break;
		}
		a[i]+=k;
		c[b[i]]+=k;
	}
	for(int i=((p==l[b[p]])?b[p]:b[p]+1);i<=((q==r[b[q]])?b[q]:b[q]-1);i++)
	{
		lazy[i]+=k;
	}
	for(int i=l[b[q]];i<=q;i++)
	{
		if(q==r[b[q]])
		{
			break;
		}
		a[i]+=k;
		c[b[i]]+=k;
	}
}

int main()
{
	scanf("%d%d",&n,&f);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build();
	for(int i=1;i<=f;i++)
	{
		int a1,b1,c1,d1;
		scanf("%d",&a1);
		if(a1==1)
		{
			scanf("%d%d%d",&b1,&c1,&d1);
			update(b1,c1,d1);
		}
		if(a1==2)
		{
			scanf("%d",&b1);
			a[1]+=b1;
		}
		if(a1==3)
		{
			scanf("%d",&b1);
			a[1]-=b1;
		}
		if(a1==4)
		{
			scanf("%d%d",&b1,&c1);
			printf("%d\n",query(b1,c1));
		}
		if(a1==5)
		{
			printf("%d\n",a[1]+lazy[1]);
		}
		printf("\n");
		for(int i=1;i<=n;i++)
		{
			printf("%d ",a[i]);
		}
		printf("\n");
	}
	return 0;
}
	
	
2020/8/16 21:11
加载中...