求大佬帮忙改一下树剖

P3178 [HAOI2015] 树上操作

蒟蒻感觉是线段树修改中出的问题,但没看出来
by WJX3078 @ 2020-10-23 13:53:47


@[邬健翔307816794](/user/109931) %%%WJX大佬
by itisover @ 2020-10-23 14:03:22


%%%,邬健翔dalao
by Farkas_W @ 2020-10-23 14:03:35


@[邬健翔307816794](/user/109931) swap不要用异或,开了O2用异或会更慢(个人感觉
by itisover @ 2020-10-23 14:04:49


@[邬健翔307816794](/user/109931) 为啥l==r的时候要return啊/挠头
by AuCloud @ 2020-10-23 14:06:27


感觉线段树写的看不懂,附上我的线段树 ```cpp void pushdown(int x,int l,int r){ int mid=l+r>>1; sum[ls]+=lazy[x]*(mid-l+1),sum[rs]+=lazy[x]*(r-mid); lazy[ls]+=lazy[x],lazy[rs]+=lazy[x]; lazy[x]=0; } void update(int x,int l,int r,int xl,int xr,int v){ if(xl<=l&&xr>=r){ sum[x]+=v*(r-l+1); lazy[x]+=v; return; } pushdown(x,l,r); int mid=l+r>>1; if(xl<=mid) update(ls,l,mid,xl,xr,v); if(xr>mid) update(rs,mid+1,r,xl,xr,v); sum[x]=sum[ls]+sum[rs]; } int query(int x,int l,int r,int xl,int xr){ int res=0; if(xl<=l&&xr>=r){ return sum[x]; } pushdown(x,l,r); int mid=l+r>>1; if(xl<=mid) res+=query(ls,l,mid,xl,xr); if(xr>mid) res+=query(rs,mid+1,r,xl,xr); return res; } void build(int x,int l,int r){ if(l==r){ sum[x]=a[seq[l]]; return; } int mid=l+r>>1; build(ls,l,mid); build(rs,mid+1,r); sum[x]=sum[ls]+sum[rs]; } ```
by itisover @ 2020-10-23 14:10:27


@[邬健翔307816794](/user/109931) 建议按照蓝书上的变量命名,对不起实在看不懂线段树
by itisover @ 2020-10-23 14:25:25


~~change 建议重构~~看了半天看不出来
by zyx10 @ 2020-10-23 14:34:49


~~我在本地格式化改变量改了半天才看懂~~ 线段树没写错,你是不是中间操作错了,P3384这个板子我加了个modifyRange函数就过了
by EternalLightning @ 2020-10-23 16:07:02


谢谢各位大佬的回复,之前在忙其他事,所以我没有看到,现在我统一回复一下
by WJX3078 @ 2020-10-23 19:45:04


| 下一页