线段树入门题

 

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define ll long long
const int maxn=1e5+5;
struct node
{
	ll val,addition;
	int left,right,lazy;
}tree[4*maxn];
void build(int L,int R,int num)
{
	tree[num].left=L;
	tree[num].right=R;
	tree[num].lazy=0;
	tree[num].addition=0;
	int mid=(L+R)/2;
	if(L==R)
	{
		scanf("%lld",&tree[num].val);
		return ;
	}
	build(L, mid,2*num);
	build(mid+1,R,2*num+1);
	tree[num].val=tree[2*num].val+tree[2*num+1].val;
}

void pushdown(int num)
{
	if(tree[num].lazy)
	{
		tree[num].lazy=0;
		tree[2*num].addition+=tree[num].addition;
		tree[2*num].val+=tree[num].addition*(tree[2*num].right-tree[2*num].left+1);
		tree[2*num].lazy=1;
		tree[2*num+1].addition+=tree[num].addition;
		tree[2*num+1].val+=tree[num].addition*(tree[2*num+1].right-tree[2*num+1].left+1);
		tree[2*num+1].lazy=1;
		tree[num].addition=0;
		
	}
	
}

void update(int l,int r,ll v,int num)
{
	if(tree[num].left>=l&&r>=tree[num].right)
	{
		tree[num].addition+=v;
		tree[num].val+=v*(tree[num].right-tree[num].left+1);
		tree[num].lazy=1;
		return;
	}
	pushdown(num);
	int mid=(tree[num].left+tree[num].right)/2;
	if(l<=mid)update(l,r,v,2*num);
	if(r>mid)update(l,r,v,2*num+1);

	tree[num].val=tree[num*2].val+tree[num*2+1].val;
}



ll query(int l,int r,int num)
{
	ll ans=0;
	
	if(tree[num].left>=l&&tree[num].right<=r)
	{
		
		return tree[num].val;
	}
	pushdown(num);
	int mid=(tree[num].left+tree[num].right)/2;
	if(l<=mid)ans+=query(l,r,2*num);
	if(r>mid)ans+=query(l,r,2*num+1);
	
	return ans;
}

int main()
{
// 	std::ios::sync_with_stdio(false);
	int n,q,i,l,r;
	ll v;
	char sta;
	cin>>n>>q;
	
	build(1,n,1);
	for(i=0;i<q;i++)
	{
		scanf(" %c",&sta);
		if(sta=='Q')
		{
			scanf("%d %d",&l,&r);
			printf("%lld\n",query(l,r,1));
		}
		else
		{
			scanf("%d %d %lld",&l,&r,&v);
			update(l,r,v,1);
		}
	}

 return 0;
}

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐