树状数组(区间操作,区间查询;单点操作,区间查询;单点查询,区间操作)

首先最基础的区间查询,单点修改:

void add(int x, int y) {
	for (; x <= n; x += x & -x) {
		dp[x] += y;
	}
}
int solve(int x) {
	int X = x,ans=0;
	for (; x; x -= x & -x) {
		ans += dp[x];
	}
	return ans;
}

然后利用差分思想实现区间操作,单点查询:

int last=0;
for(int i=1;i<=n;i++){
    add(i,a[i]-last);
    last=num[i];
}//初始化
...
int l,r,k;
add(l,k),add(r+1,-k);//向l-r区间插入k
...
//查询不变

最后,区间操作,区间修改(例如守墓人):

我们搞两个数组去搞一些骚的:

void add(long long x, long long y) {
	int X = x-1;
	for (; x <= n; x += x & -x)dp[x] += y,dp2[x]+=y*X;
}
long long solve(long long x) {
	long long ans = 0;
	long long X = x;
	for (; x; x -= x & -x) {
		ans += dp[x]*X-dp2[x];
	}
	return ans;
}
//其余与区间修改单点查询相同

(写这篇笔记主要是因为我好像总是把这三个操作搞混...)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱游戏啊啊啊啊啊啊

爸爸您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值