线段树,样例过,评测28,求助
查看原帖
线段树,样例过,评测28,求助
448965
杨丶老爹楼主2021/8/15 21:48

RT 代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int lazy[N],n,m,sum[N];
void pushup(int rt)
{
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt)
{
	if(l==r)
	{
		scanf("%d",&sum[rt]);
		return;
	}
	int mid=l+r>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	pushup(rt);
}
void pushdown(int rt,int ln,int rn)
{
	if(lazy[rt])
	{
		lazy[rt<<1]+=lazy[rt];
		lazy[rt<<1|1]+=lazy[rt];
		sum[rt<<1]+=lazy[rt]*ln;
		sum[rt<<1|1]+=lazy[rt]*rn;
		lazy[rt]=0;
	}
}
void modify(int l,int r,int rt,int nowl,int nowr,int c)
{
	if(nowl<=l && nowr>=r)
	{
		lazy[rt]+=c;
		sum[rt]+=(r-l+1)*c;
		return;
	}
	int mid=l+r>>1;
	pushdown(rt,mid-l+1,r-mid);
	if(nowl<=mid) modify(l,mid,rt<<1,nowl,nowr,c);
	if(nowr>mid) modify(mid+1,r,rt<<1|1,nowl,nowr,c);
	pushup(rt);
}
int query(int l,int r,int rt,int nowl,int nowr)
{
	if(nowl<=l && nowr>=r) return sum[rt];
	int mid=l+r>>1;
	int ans=0;
	pushdown(rt,mid-l+1,r-mid);
	if(nowl<=mid) ans+=query(l,mid,rt<<1,nowl,nowr);
	if(nowr>mid) ans+=query(mid+1,r,rt<<1|1,nowl,nowr);
	return ans;
}
int main()
{
	cin>>n>>m;
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		int op,x,y,z;
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d%d",&x,&y,&z);
			modify(1,n,1,x,y,z);
		}
		if(op==2)
		{
			scanf("%d",&z);
			modify(1,n,1,1,1,z);
		}
		if(op==3)
		{
			scanf("%d",&z);
			modify(1,n,1,1,1,-z);
		}
		if(op==4)
		{
			scanf("%d%d",&x,&y);
			printf("%d\n",query(1,n,1,x,y));
		}
		if(op==5)
		{
			printf("%d\n",query(1,n,1,1,1));
		}
	}
	return 0;
}
2021/8/15 21:48
加载中...