#define maxn 50010
#define l(u) (u<<1)
#define r(u) (u<<1|1)
//寫在類裡面爆棧
int n, m, q;
int tim; //時間戳
int num[maxn]; //樹上每個節點的初始值
int siz[maxn]; //siz[u]表示以u為根的子樹的節點數
int top[maxn]; //樹鏈上深度最小的點
int son[maxn]; //重兒子
int dep[maxn]; //深度
int tid[maxn]; //節點的時間戳
int _tid[maxn]; //tid[i]=j表示時間戳為i的節點是j
int father[maxn]; //父節點
bool vis[maxn];
vectoredge[maxn];
void init(int n)
} void addedge(int u, int v) //無根樹加雙向邊
//樹鏈剖分 dfs1(1,0)
void dfs1(int u, int pre)
} } //注意清空vis,dfs2(1,1)
void dfs2(int u, int tp)
} void update(int u, int l, int r, int v); //線段樹的更新函式
void change(int x, int y, int val)
if(dep[x] > dep[y]) //同一條重鏈上深度小的tid小
swap(x, y);
update(1, tid[x], tid[y], val);
}
//線段樹部分
樹鏈剖分 模板
class match node a n struct no no aa n 4 void init void addpage int x,int y void dfs int s,int faa,int h 根節點,父節點和深度的 if max 0 son s sign void dfs2 int...
樹鏈剖分模板
點權模板 1 m a b c將節點a到節點b路徑上所有點都染成顏色c 2 q a b詢問節點a到節點b路徑上的顏色段數量 連續相同顏色被認為是同一段 如 112221 由3段組成 11 222 和 1 const int n 100100 struct edge g n 2 int cnt,head...
模板 樹鏈剖分
如果你會了樹上dp,還會線段樹 沒錯!我都會啊!那你為什麼寫不出樹鏈剖分?by勇者和路由器的對話,今天二位仍然過得十分愉快 bzoj1036 zjoi2008 樹的統計 題目描述 一棵樹上有n個節點,編號分別為1到n,每個節點都有乙個權值w。我們將以下面的形式來要求你對這棵樹完成一些操作 i.cha...