社区讨论
只A了一个点,谁能帮忙看一下哪里出问题了
P3372【模板】线段树 1参与者 4已保存回复 12
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 12 条
- 当前快照
- 1 份
- 快照标识符
- @mi7cmm5j
- 此快照首次捕获于
- 2025/11/20 19:29 4 个月前
- 此快照最后确认于
- 2025/11/20 21:58 4 个月前
CPP
#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
const ll N=100010;
ll n,m,x,y,k;
struct T{
ll l,r,len,val,lazy;
}e[N<<2];
inline ll read(){
ll p=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')p=p*10+c-'0',c=getchar();
return p*f;
}
void bui(int d,ll L,ll R){
e[d].l=L;e[d].r=R;e[d].len=R-L+1;
e[d].lazy=0;
if(L==R){
e[d].val=read();
return ;
}
ll mid=(L+R)>>1;
bui(d<<1,L,mid);
bui(d<<1|1,mid+1,R);
e[d].val=e[d<<1].val+e[d<<1|1].val;
}
void ch(int d,ll L,ll R,ll v){
if(L>e[d].r||R<e[d].l) return ;
if(e[d].l>=L&&e[d].r<=R){
e[d].val+=e[d].len*v;
e[d].lazy+=v;
return ;
}
ch(d<<1,L,R,v);ch(d<<1|1,L,R,v);
e[d].val=e[d<<1].val+e[d<<1|1].val;
}
void push_down(int d){
e[d<<1].val+=e[d].lazy*e[d<<1].len;
e[d<<1|1].val+=e[d].lazy*e[d<<1|1].len;
e[d<<1].lazy+=e[d].lazy;
e[d<<1|1].lazy+=e[d].lazy;
e[d].lazy=0;
}
ll find(int d,ll L,ll R){
if(L>e[d].r||R<e[d].l) return 0;
if(e[d].l>=L&&e[d].r<=R) return e[d].val;
push_down(d);
ll ans=0;
ans+=find(d<<1,L,R);
ans+=find(d<<1|1,L,R);
return ans;
}
int main(){
freopen("test.txt","r",stdin);
n=read();m=read();
bui(1,1,n);
while(m--){
k=read();x=read();y=read();
if(k>1){
printf("%lld\n",find(1,x,y));
continue ;
}
k=read();
ch(1,x,y,k);
}
return 0;
}
回复
共 12 条回复,欢迎继续交流。
正在加载回复...