萌新求助树剖,调死力

P3384 【模板】重链剖分/树链剖分

@[云浅知处](/user/307453) dfs2没判断是否是父节点
by 啊嘞嘞嘞嘞 @ 2020-09-02 21:34:11


@[云浅知处](/user/307453) 问题太多了。 - dfs2,dfs1没判父亲 - rk数组用错了,该dfn - 过不了样例
by JK_LOVER @ 2020-09-02 21:44:15


- si[r] 没有更新
by JK_LOVER @ 2020-09-02 21:46:22


@[JK_LOVER](/user/227824) - 过不了样例我知道啦QAQ - DFS1DFS2判父节点了qwq - rk数组改dfn了,这里是改后之后的: ```cpp LL DFS1(LL u,LL dep){ hson[u]=0; sz[hson[u]]=0; d[u]=dep; sz[u]=1; for(LL i=0,s=v[u].size();i<s;i++){ if(v[u][i]==fa[u])continue; sz[u]+=DFS1(v[u][i],dep+1); fa[v[u][i]]=u; if(sz[v[u][i]]>sz[hson[u]]){ hson[u]=v[u][i]; } } return sz[u]; } LL tot=0; void DFS2(LL u,LL tp){ top[u]=tp; tot++; dfn[u]=tot; val[tot]=w[u]; rk[tot]=u; if(hson[u]!=0){ DFS2(hson[u],tp); for(LL i=0,s=v[u].size();i<s;i++){ if(v[u][i]!=hson[u]&&v[u][i]!=fa[u]){ DFS2(v[u][i],v[u][i]); } } } } ``` ```cpp inline void add(LL x,LL y,LL z){ z%=p; while(top[x]!=top[y]){ if(d[top[x]]<d[top[y]])swap(x,y); tree.change(dfn[top[x]],dfn[x],z,1,n,1); x=fa[top[x]]; } if(d[x]>d[y])swap(x,y); tree.change(dfn[x],dfn[y],z,1,n,1); } inline LL querysum(LL x,LL y){ LL ans=0; while(top[x]!=top[y]){ if(d[top[x]]<d[top[y]])swap(x,y); ans+=tree.query(dfn[top[x]],dfn[x],1,n,1); x=fa[top[x]]; } if(d[x]>d[y])swap(x,y); ans+=tree.query(dfn[x],dfn[y],1,n,1); return ans; } inline void addson(LL x,LL z){ z%=p; tree.change(dfn[x],dfn[x]+sz[x]-1,z,1,n,1); } inline LL queryson(LL x){ return tree.query(dfn[x],dfn[x]+sz[x]-1,1,n,1)%p; } ```
by 云浅知处 @ 2020-09-02 21:49:43


@[JK_LOVER](/user/227824) si[r]是啥啊/fad
by 云浅知处 @ 2020-09-02 21:50:13


@[云浅知处](/user/307453) 根节点的size/kk
by JK_LOVER @ 2020-09-02 22:01:56


@[云浅知处](/user/307453) 建议插入中间输出代码判断具体是哪个函数出错( 如: ``` DFS1(r,1); printf("dfs1\n"); DFS2(r,r); printf("dfs2\n"); tree.build(1,n,1); ```
by StarLbright40 @ 2020-09-02 22:03:59


@[星光0000](/user/128570) 这么搞一下,出来之后,貌似是`DFS1`错了?`DFS2`和`build`没问题
by 云浅知处 @ 2020-09-02 22:07:14


@[云浅知处](/user/307453) 啥也没输出就是dfs1炸了嘛(废话
by StarLbright40 @ 2020-09-02 22:09:38


~~把dfs1改成void试试?~~
by StarLbright40 @ 2020-09-02 22:13:26


| 下一页