Crouy_Li_Dorac @ 2024-08-02 13:11:27
rt
线段树写法后三个大数据WA了,不解QAQ
#include<bits/stdc++.h>
#define ll long long
const int N=1e5+20;
using namespace std;
ll n,m;
ll a[N];
ll tree[4*N];
ll tag[4*N];
ll ls(ll p){return p<<1;}
ll rs(ll p){return p<<1|1;}
void push_up(ll p){
tree[p]=tree[ls(p)]+tree[rs(p)];
}
void build(ll p,ll pl,ll pr){
tag[p]=0;
if(pl==pr){tree[p]=a[pl];return;}
ll mid=(pl+pr)>>1;
build(ls(p),pl,mid);
build(rs(p),mid+1,pr);
push_up(p);
}
void addtag(ll p,ll pl,ll pr,ll d){
tag[p]+=d;
tree[p]+=d*(pr-pl+1);
}
void push_down(ll p,ll pl, ll pr){
if(tag[p]){
ll mid=(pl+pr)>>1;
addtag(ls(p),pl,mid,tag[p]);
addtag(rs(p),mid+1,pr,tag[p]);
tag[p]=0;
}
}
void update(ll l,ll r,ll p,ll pl,ll pr,ll d){
if(l<=pl&&r>=pr){
addtag(p,pl,pr,d);
return;
}
push_down(p,pl,pr);
ll mid=(pl+pr)>>1;
if(l<=mid) update(l,r,ls(p),pl,mid,d);
if(r>mid) update(l,r,rs(p),mid+1,pr,d);
push_up(p);
}
ll query(ll l,ll r,ll p,ll pl,ll pr){
if(pl>=l&&r>=pr) return tree[p];
push_down(p,pl,pr);
ll res=0;
ll mid=(pr+pl)>>1;
if(mid>=l) res+=query(l,r,ls(p),pl,mid);
if(r>mid) res+=query(l,r,rs(p),mid+1,pr);
return res;
}
int main(){
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);
while(m--){
ll q,l,r,d;
scanf("%lld",&q);
if(q==1){
scanf("%lld%lld%lld",&l,&r,&d);
update(l,r,1,1,n,d);
}
if(q==2){
scanf("%lld%lld",&l,&r);
printf("%d\n",query(l,r,1,1,n));
}
}
return 0;
}
玄关求dalao赐教
by Epi4any @ 2024-08-02 13:23:11
@Crouy_Li_Dorac 你最后输出忘记改成 lld
了
by Epi4any @ 2024-08-02 13:23:31
printf("%lld\n",query(l,r,1,1,n));
by lianchanghua @ 2024-08-02 13:30:17
@Crouy_Li_Dorac 下载了样例,你的程序输出有负数
by lianchanghua @ 2024-08-02 13:31:21
@Crouy_Li_Dorac 建议在编译器选项中添加:-Wall
by Crouy_Li_Dorac @ 2024-08-02 13:43:18
@Faith_toChange 好的谢谢大佬,已关
by Crouy_Li_Dorac @ 2024-08-02 13:43:59
@lianchanghua 好的谢谢,已关