改了一些,不死循环了,输出特别特别大

P3372 【模板】线段树 1

你已经过了问啥???
by ker_xyxyxyx_xxs @ 2021-09-05 15:11:34


pushdown 显然假了 建议重学一遍
by MatrixCascade @ 2021-09-05 15:11:52


你的代码AC: ```cpp #include<iostream> using namespace std; #define MAXN 100000 #define ll long long struct node{ int l,r,w,tag; }tree[4*MAXN]; ll n,m,a[MAXN]; void pushdown(ll i){ tree[i*2].tag+=tree[i].tag; tree[i*2+1].tag+=tree[i].tag; tree[i*2].w+=tree[i].tag*(tree[i*2].r-tree[i*2].l+1); tree[i*2+1].w+=tree[i].tag*(tree[i*2+1].r-tree[i*2+1].l+1); tree[i].tag=0; return; } void update(ll i,ll l,ll r,ll k){ if(tree[i].l>=l&&tree[i].r<=r){ tree[i].w+=k*(tree[i].r-tree[i].l+1); tree[i].tag+=k; return; } pushdown(i); ll mid=(tree[i].l+tree[i].r)/2; if(mid>=l) update(i*2,l,r,k); if(mid+1<=r) update(i*2+1,l,r,k); tree[i].w=tree[i*2].w+tree[i*2+1].w; return; } ll sum(ll i,ll l,ll r){ if(tree[i].l>=l&&tree[i].r<=r) return tree[i].w; pushdown(i); ll ans=0,mid=(tree[i].l+tree[i].r)/2; if(mid>=l) ans+=sum(i*2,l,r); if(mid+1<=r) ans+=sum(i*2+1,l,r); return ans; } void build(ll i,ll l,ll r){ tree[i].l=l,tree[i].r=r; if(l==r){ tree[i].w=a[l]; return; } ll mid=(l+r)/2; build(i*2,l,mid); build(i*2+1,mid+1,r); tree[i].w=tree[i*2].w+tree[i*2+1].w; return; } int main(){ cin>>n>>m; for(ll i=1;i<=n;i++) cin>>a[i]; build(1,1,n); while(m--){ int t; cin>>t; if(t==1){ ll x,y,k; cin>>x>>y>>k; update(1,x,y,k); } else{ ll x,y; cin>>x>>y; cout<<sum(1,x,y)<<endl; } } return 0; } ``` 修改了pushdown和long long
by ker_xyxyxyx_xxs @ 2021-09-05 15:12:05


@[ker_xyxyxyx_xxs](/user/335477) 测题解的
by WaltVBAlston @ 2021-09-05 15:12:28


@[Andy_2006](/user/261262) ```cpp tree[i*2].w+=tree[i].w*(tree[i*2].r-tree[i*2].l+1); tree[i*2+1].w+=tree[i].w*(tree[i*2+1].r-tree[i*2+1].l+1); ``` 改为 ```cpp tree[i*2].w+=tree[i].tag*(tree[i*2].r-tree[i*2].l+1); tree[i*2+1].w+=tree[i].tag*(tree[i*2+1].r-tree[i*2+1].l+1); ```
by ADay @ 2021-09-05 15:12:28


@[ADay](/user/312393) @[ker_xyxyxyx_xxs](/user/335477) @[MatrixCascade](/user/154101) OTZ谢谢大佬们
by WaltVBAlston @ 2021-09-05 15:13:44


|