社区讨论
95分,求调,改对必关
P3372【模板】线段树 1参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mjf66zcx
- 此快照首次捕获于
- 2025/12/21 11:31 2 个月前
- 此快照最后确认于
- 2025/12/23 19:15 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define N 200005
struct Node{
int l,r;
long long sum;
long long add;
}tr[N*4];
int a[N];
int n,m;
void pushup(Node &u,Node &l,Node &r){
u.sum=l.sum+r.sum;
}
void pushup(int u){
pushup(tr[u],tr[2*u],tr[2*u+1]);
}
void pushdown(int u){
auto &root=tr[u],&left=tr[2*u],&right=tr[2*u+1];
if (root.add) {
left.add+=root.add;
left.sum+=(long long)(left.r-left.l+1)*root.add;
right.add+=root.add;
right.sum+=(long long)(right.r-right.l+1)*root.add;
root.add=0;
}
}
void build(int u,int l,int r){
if(l==r){
tr[u].l=l,tr[u].r=r,tr[u].sum=a[l],tr[u].add=0;
}
else {
tr[u].l=l,tr[u].r=r;
int mid=(l+r)/2;
build(2*u,l,mid);
build(2*u+1,mid+1,r);
pushup(u);
tr[u].add=0;
}
}
void modify(int u,int l,int r,long long d){
if(tr[u].l>=l&&tr[u].r<=r){
tr[u].sum+=(long long)(tr[u].r-tr[u].l+1)*d;
tr[u].add+=d;
}
else{
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if (l<=mid) modify(2*u,l,r,d);
if (r>mid) modify(2*u+1,l,r,d);
pushup(u);
}
}
Node query(int u,int l,int r){
if (tr[u].l >= l && tr[u].r <= r) return tr[u];
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if (r<=mid) return query(2*u,l,r);
if (l>mid) return query(2*u+1,l,r);
Node left=query(2*u,l,r);
Node right=query(2*u+1,l, r);
Node res;
res.l=left.l;
res.r=right.r;
pushup(res,left,right);
return res;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,1,n);
for(int i=1;i<=m;i++){
int p;
int x,y;
long long k;
scanf("%d",&p);
if(p==1){
scanf("%d%d%lld",&x,&y,&k);
modify(1,x,y,k);
}
else{
scanf("%d%d",&x,&y);
printf("%lld\n",query(1,x,y).sum);
}
}
return 0;
}
95分,只错了第19个测试点,求调,改对必关
回复
共 3 条回复,欢迎继续交流。
正在加载回复...