35分-树状数组
  • 板块P2357 守墓人
  • 楼主dz_zhhx
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/8/25 11:36
  • 上次更新2023/11/6 19:26:33
查看原帖
35分-树状数组
244456
dz_zhhx楼主2020/8/25 11:36
#include<bits/stdc++.h>
using namespace std;
int shu1[500010],shu2[500010];
int p,l,r,k,n,f;
long long zhu;
int lowbit(int x) {return x&(-x);}
void add(int pos,int x)
{
	for(int i=pos;i<=n;i+=lowbit(i))
	   shu1[i]+=x,shu2[i]+=pos*x;
}
long long cha(int pos)
{
	long long ret=0;
	for(int i=pos;i>=1;i-=lowbit(i))
	   ret+=(pos+1)*shu1[i]-shu2[i];
	return ret;
}
int main()
{
//	freopen("in.in","r",stdin);
	cin>>n>>f;
	int last=0;
	for(int i=1;i<=n;i++)
	{
		int x;
		scanf("%d",&x);
		add(i,x-last);
		last=x;
	}
	
	for(int i=1;i<=f;i++)
	{
		scanf("%d",&p);
		if(p==1)
		{
			scanf("%d%d%d",&l,&r,&k);
			add(l,k);
			add(r+1,-k);
		}
		if(p==2)
		{
			scanf("%d",&k);
			zhu+=k;
		}
		if(p==3)
		{
			scanf("%d",&k);
			zhu-=k;
		}
		if(p==4)
		{
			scanf("%d%d",&l,&r);
			long long k1=cha(r);
			long long k2=cha(l-1);
			if(l==1) k1+=zhu;
			printf("%d\n",k1-k2);
		}
		if(p==5)
		{
			printf("%d\n",cha(1)+zhu);
		}
	}
	return 0;
}

死活过不去

2020/8/25 11:36
加载中...