社区讨论
板子写炸了,求调,悬1关注
P3372【模板】线段树 1参与者 3已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @m2jpjktq
- 此快照首次捕获于
- 2024/10/22 08:28 去年
- 此快照最后确认于
- 2024/10/22 08:40 去年
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
int n,m,ci,x,y,k,a[N],ans[N << 2],tag[N << 2];
void push_up(int p)
{
ans[p] = ans[p << 1] + a[p << 1 | 1];
}
void build(int p,int l,int r)
{
if (l == r)
{
ans[p] = a[l];
return;
}
int mid = (l + r) >> 1;
build(p << 1,l,mid);
build(p << 1 | 1,mid + 1,r);
push_up(p);
}
void mark(int p,int l,int r,int k)
{
tag[p] += k;
ans[p] += k * (r - l + 1);
}
void push_down(int p,int l,int r)
{
int mid = (l + r) >> 1;
mark(p << 1,l,mid,tag[p]);
mark(p << 1 | 1,mid + 1,r,tag[p]);
tag[p] = 0;
}
void update(int target1,int target2,int l,int r,int p,int k)
{
if (target1 <= l && r <= target2)
{
mark(p,l,r,k);
return;
}
push_down(p,l,r);
int mid = (l + r) >> 1;
if (target1 <= mid)
update(target1,target2,l,mid,p << 1,k);
if (target2 > mid)
update(target1,target2,mid + 1,r,p << 1 | 1,k);
push_up(p);
}
int query(int target1,int target2,int l,int r,int p)
{
int s = 0;
if (target1 <= l && r <= target2)
return ans[p];
int mid = (l + r) >> 1;
push_down(p,l,r);
if (target1 <= mid)
s += query(target1,target2,l,mid,p << 1);
if (target2 > mid)
s += query(target1,target2,mid + 1,r,p << 1 | 1);
return s;
}
signed main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
cin >> a[i];
build(1,1,n);
while (m--)
{
cin >> ci >> x >> y;
if (ci == 1)
{
cin >> k;
update(x,y,1,n,1,k);
}
else
cout << query(x,y,1,n,1) << endl;
}
return 0;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...