社区讨论
萌新刚学OI,这个树状数组打炸了
题目总版参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mdy6gjz1
- 此快照首次捕获于
- 2025/08/05 14:48 7 个月前
- 此快照最后确认于
- 2025/08/05 14:48 7 个月前
板子题:
区间修改,单点查询,样例都没过
#include<bits/stdc++.h>
#define mian main
#define QWQ puts("QWQ");
using namespace std;
int n, m;
int tree[500005];
int lowbit(int x)//求lowbit:2进制下末尾0的个数。可表示tree中包含数据数量
{
return x & -x;
}
void _add(int x, int k)
{
for(;x <= n; x += lowbit(x))
tree[x] += k;
}
long long _find(int x)
{
long long ans = 0;
for(;x > 0; x -= lowbit(x))
ans += tree[x];
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++)
{
long long k, lk = 0;
scanf("%lld", &k);
_add(i, k - lk);
lk = k;//差分
}
for(int i = 1; i <= m; i ++)
{
int p;
long long x, y, k;
scanf("%d", &p);
if(p == 1)
{
scanf("%lld%lld%lld", &x, &y, &k);
_add(x, k);
_add(y + 1, -k);//修改头尾。因为中间差未变
}
else
{
scanf("%lld", &x);
printf("%lld\n", _find(x));//因为是差分所以前x项差分和就为所求数
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...