社区讨论
十万火急!!线段树求调
P3372【模板】线段树 1参与者 3已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @m2n9ussr
- 此快照首次捕获于
- 2024/10/24 20:20 去年
- 此快照最后确认于
- 2025/11/04 16:18 4 个月前
距离下机还有半小时,各位大佬球球了
orz orz
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n,m;
int a[N],w[N * 4],lzy[N * 4];
void build(int id,int l,int r)
{
if(l == r){
w[id] = a[l];
return;
}
int mid = (l + r) >> 1;
build(id << 1,l,mid);
build(id << 1 | 1,mid + 1,r);
w[id] = w[id << 1] + w[id << 1 | 1];
return ;
}
void push_down(int id,int l,int r)
{
if(lzy[id] == 0) return;
lzy[id << 1] += lzy[id];
lzy[id << 1 | 1] += lzy[id];
int mid = (l + r) >> 1;
w[id << 1] += (mid - l + 1) * lzy[id];
w[id << 1 | 1] += (r - mid) * lzy[id];
lzy[id] = 0;
}
void update(int id,int l,int r,int L,int R,int c)
{
if(l >=L && r <= R)
{
w[id] += (r - l + 1) *c;
lzy[id] += c;
return ;
}
push_down(id,l,r);
int mid = (l + r) >> 1;
if(R <= mid) update(id << 1,l,mid,L,R,c);
else if(L > mid) update(id << 1 | 1,mid + 1,r,L,R,c);
else update(id << 1,l,mid,L,mid,c),update(id << 1 | 1,mid + 1,r,mid + 1,R,c);
w[id] = w[id << 1] + w[id << 1 | 1];
}
int find(int id,int l,int r,int L,int R)
{
if(l >= L && r <= R)
{
return w[id];
}
push_down(id,l,r);
int mid = (l + r) >> 1;
if(R <= mid) find(id << 1,l,mid,L,R);
else if(L > mid) find(id << 1 | 1,mid + 1,r,L,R);
else find(id << 1,l,mid,L,mid) + find(id << 1 | 1,mid + 1,r,mid + 1,R);
}
signed main()
{
int n,m;
scanf("%lld%lld",&n,&m);
for(int i = 1;i <= n; ++ i)
scanf("%lld",&a[i]);
build(1,1,n);
while(m --)
{
int op,l,r,c;
scanf("%lld",&op);
if(op == 1)
{
scanf("%lld%lld%lld",&l,&r,&c);
update(1,1,n,l,r,c);
}
if(op == 2)
{
scanf("%lld%lld",&l,&r);
cout << find(1,1,n,l,r) << endl;
}
}
}
回复
共 6 条回复,欢迎继续交流。
正在加载回复...