社区讨论
标记永久化不会写,15pts WA 求调
P3372【模板】线段树 1参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @miq41fht
- 此快照首次捕获于
- 2025/12/03 22:36 3 个月前
- 此快照最后确认于
- 2025/12/06 10:15 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long a[100005];
struct node
{
long long data,lazy=0;
}tree[400060];
void pushup(int idx)
{
tree[idx].data=tree[idx<<1].data+tree[idx<<1|1].data;
return;
}
void build(int l,int r,int idx)
{
if(l==r)
{
tree[idx].data=a[l];
return;
}
int mid=l+((r-l)>>1);
build(l,mid,idx<<1);
build(mid+1,r,idx<<1|1);
pushup(idx);
return;
}
long long query(int L,int R,int l,int r,int idx,long long t)
{
if(l>R||r<L) return 0;
if(l>=L&&r<=R) return tree[idx].data+t*(r-l+1);
int mid=l+((r-l)>>1);
return query(L,R,l,mid,idx<<1,t+tree[idx].lazy)+query(L,R,mid+1,r,idx<<1|1,t+tree[idx].lazy);
}
void update(int L,int R,int l,int r,int idx,long long k)
{
if(l>R||r<L) return;
if(l>=L&&r<=R)
{
tree[idx].data+=k*(r-l+1),tree[idx].lazy+=k;
return;
}
int mid=l+((r-l)>>1);
update(L,R,l,mid,idx<<1,k);
update(L,R,mid+1,r,idx<<1|1,k);
pushup(idx);
return;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,n,1);
for(int i=1,cz,x,y;i<=m;i++)
{
cin>>cz>>x>>y;
if(cz==1)
{
long long k;
cin>>k;
update(x,y,1,n,1,k);
}
else cout<<query(x,y,1,n,1,0)<<endl;
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...