萌新求助,树状数组
  • 板块P2357 守墓人
  • 楼主lucky2008
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/1/19 22:41
  • 上次更新2023/10/28 11:53:19
查看原帖
萌新求助,树状数组
244578
lucky2008楼主2022/1/19 22:41
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1e6+5;
long long a[N],b[N],c1[N],c2[N],n,m;
long long lowbit(long long num)
{
	return num&(-num);
}
void add(long long pos,long long num)
{
	long long num1=pos*num;
	for(int i=pos;i<=n;i+=lowbit(i))
		c1[i]+=num,c2[i]+=num1;
	return;
}
long long query1(long long pos)
{
	long long num=0;
	for(int i=pos;i>=1;i-=lowbit(i))
		num+=c1[i];
	return num;
}
long long query2(long long pos)
{
	long long num=0;
	for(int i=pos;i>=1;i-=lowbit(i))
		num+=c2[i];
	return num;
}
long long query(long long l,long long r)
{
	return (query1(r)*(r+1ll)-query2(r))-(query1(l-1)*l-query2(l-1));
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	for(int i=1;i<=n;++i)
		b[i]=a[i]-a[i-1],add(i,b[i]);
	while(m--)
	{
		long long op,x,y,z;
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>z;
			add(x,z);add(y+1,-z);			
		}
		if(op==2)
		{
			cin>>z;x=y=1;
			add(x,z);add(y+1,-z);			
		}
		if(op==3)
		{
			cin>>z;x=y=1;z*=-z;
			add(x,z);add(y+1,-z);			
		}
		if(op==4)
		{
			cin>>x>>y;
			cout<<query(x,y)<<endl;		
		}
		if(op==5)
			cout<<query(1,1)<<endl;			
	} 
	return 0;
} 
2022/1/19 22:41
加载中...