洛谷 P3368 【模板】树状数组 2(区间更新+单点求值)

传送门

题目:

在这里插入图片描述

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int tree[N],a[N],n,m;
int lowbit(int x)
{
    
    
	return x&(-x);
}
void updata(int i,int t)
{
    
    
	while(i<=n)
	{
    
    
		tree[i]+=t;
		i+=lowbit(i);
	}
}
int quiry(int i)
{
    
    
	int res=0;
	while(i>0)
	{
    
    
		res+=tree[i];
		i-=lowbit(i);
	}
	return res;
}
int main()
{
    
    
	cin>>n>>m;
	for(int i=1;i<=n;i++){
    
    
		cin>>a[i];
		updata(i,a[i]-a[i-1]);//更新差值 
	}
	while(m--)
	{
    
    
		int f,x;
		cin>>f>>x;
		if(f==1){
    
    
			int y,k;
			cin>>y>>k;
			//维持区间内的差值不变
			updata(x,k);
			updata(y+1,-k);
		}
		else{
    
    
			//0~x区间的值即为所求 
			cout<<quiry(x)<<endl;
		}
	}
	return 0;
}
        }

总结:

这类题型运用到的是差分的思想,当对一段区间的值进行修改时,需要维持当前区间的差值不变

构建树状数组时也需要通过差分进行构建

猜你喜欢

转载自blog.csdn.net/Lzhzl211/article/details/114801523