樹鏈剖分模板 LG3384

2021-08-22 04:57:00 字數 1471 閱讀 6125

這裡是來湊個帖的,勿看。

樹剖詳解

本人題目寫炸了的經歷和經驗

#include 

using

namespace

std;

const

int n = 100010 ;

#define int long long

struct edgee[n<<1];

int head[n],f[n],dep[n],size[n],son[n],rk[n],top[n],dfn[n];

int a[n];

//f[i]:i的父親,dep[i]:i的深度,size[i]:i的子樹大小,son[i]:重兒子 ,rk[i]:i的dfs值,與dfn相反

//top[i]:i所在鏈的頂端,dfn[i]:dfs序,時間戳

int n,m,rt,tot,cnt;

int p,r ;

inline

void add(int x,int y)

void dfs1(int rt,int fa,int depth)

return ;

}void dfs2(int rt,int t)

return ;

}struct segtree[n<<1];

inline

void pushup(int rt)

void build(int ll,int rr,int rt)

else

return ;

}void update(int l,int r,int rt,int c)

else

int query(int l,int r,int rt)

inline

int sum(int x,int y)

else

} if (dfn[x]<=dfn[y]) ans=(ans+query(dfn[x],dfn[y],rt))%p ;

else ans=(ans+query(dfn[y],dfn[x],rt))%p ;

return ans%p ;

}inline

void update(int x,int y,int c)

else

}if (dfn[x]<=dfn[y]) update(dfn[x],dfn[y],rt,c) ;

else update(dfn[y],dfn[x],rt,c) ;

return ;

}main()

cnt=0 ;

dfs1(r,0,1) ;

dfs2(r,r) ;

cnt=0;

rt=cnt++ ;

build(1,n,rt);

for (int i=1;i<=m;i++)

else

if (op==2)

else

if (op==3)

else

}}

樹鏈剖分 P3384 模板 樹鏈剖分

題目描述 戳這裡 題解 其實樹剖的重點就在於輕重鏈,這篇文章寫的很好 然而我線段樹寫得全是問題,改了半天2333 如下 include include include using namespace std const int maxn 100005 int n,m,root,tt,tot,lnk ...

P3384 模板 輕重鏈剖分(樹鏈剖分模板)

入口 題目描述 如題,已知一棵包含 nn 個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作 11 格式 1 x y z1 x y z 表示將樹從 xx 到 yy 結點最短路徑上所有節點的值都加上 zz。操作 22 格式 2 x y2 x y 表示求樹從 xx 到 yy 結點最短...

P3384 模板 樹鏈剖分

傳送門 題目描述 如題,已知一棵包含n個結點的樹 連通且無環 每個節點上包含乙個數值,需要支援以下操作 操作1 格式 1 x y z 表示將樹從x到y結點最短路徑上所有節點的值都加上z 操作2 格式 2 x y 表示求樹從x到y結點最短路徑上所有節點的值之和 操作3 格式 3 x z 表示將以x為根...