社区讨论
调了一个小时 看不出错 求助
P3372【模板】线段树 1参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhj3dp96
- 此快照首次捕获于
- 2025/11/03 20:04 4 个月前
- 此快照最后确认于
- 2025/11/03 20:04 4 个月前
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
ll num[4*N],ai[N],lt[4*N];
inline ll ls(ll p){
return p<<1;
}
inline ll rs(ll p){
return p<<1|1;
}
inline void push_up(ll p){
num[p]=num[ls(p)]+num[rs(p)];
}
void build(ll l,ll r,ll p){
lt[p]=0;
if(l==r){
num[p]=ai[l];
return;
}
ll mid=(l+r)>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
push_up(p);
}
inline void f(ll p,ll k,ll l,ll r){
lt[p]+=k;
num[p]+=(r-l+1)*k;
return ;
}
inline void push_down(ll p,ll l,ll r){
ll mid=(l+r)>>1;
f(ls(p),lt[p],l,mid);
f(rs(p),lt[p],mid+1,r);
lt[p]=0;
}
void update(ll ul,ll ur,ll l,ll r,ll p,ll k){
if(ul<=l&&ur>=r){
lt[p]+=k;
num[p]+=(r-l+1)*k;
return ;
}
push_down(p,l,r);
ll mid=(l+r)>>1;
if(ul<=mid)update(ul,ur,l,mid,ls(p),k);
if(ur>mid)update(ul,ur,mid+1,r,ls(p),k);
push_up(p);
}
inline ll query(ll ql,ll qr,ll l,ll r,ll p){
if(ql<=l&&qr>=r){
return num[p];
}
push_down(p,l,r);
ll mid=(l+r)>>1;
int ans=0;
if(ql<=mid)ans+=query(ql,qr,l,mid,ls(p));
if(qr>=mid+1)ans+=query(ql,qr,mid+1,r,rs(p));
return ans;
}
int main(){
int a,b;
cin>>a>>b;
for(int i=1;i<=a;i++){
scanf("%d",&ai[i]);
}
build(1,a,1);
for(int i=1;i<=b;i++){
int c;
cin>>c;
if(c==1){
int ul,ur,k;
cin>>ul>>ur>>k;
update(ul,ur,1,a,1,k);
}
else if(c==2){
int ql,qr;
cin>>ql>>qr;
cout<<query(ql,qr,1,a,1)<<endl;
}
}
}
样例输入:
CPP5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
样例输出:
CPP11
8
20
我的输出:
CPP11
6
20
回复
共 3 条回复,欢迎继续交流。
正在加载回复...