LCA 樹鏈剖分 樹上相交路徑

2021-10-09 05:50:34 字數 1542 閱讀 5867

首先不難發現乙個結論:

因此我們可以將lca排序,每一次統計路徑上有多少lca加入即可。統計完以後,把當前路徑的lca也加入。

#include

using

namespace std;

const

int n =

2e5;

int n, m,

cnt(0)

;int l[n]

, r[n]

, fa[n]

;int size[n]

, dep[n]

, son[n]

, top[n]

;vector <

int> a[n]

;struct node a[n *10]

;int

read

(void

)void

dfs(

int x,

int f)

return;}

void

dfs2

(int x,

int cur)

r[x]

= cnt;

return;}

intlca

(int x,

int y)

return dep[x]

< dep[y]

? x : y;

}bool

cmp(node p1, node p2)

struct treelikearray

;int

ask(

int x)

void

change

(int x,

int v)

} tree;

intquery

(int x,

int y)

if(dep[x]

< dep[y]

)swap

(x, y)

; res +

= tree.

ask(l[x]

)- tree.

ask(l[y]-1

);return res;

}int

main

(void

)dfs(1

,0);

dfs2(1

,1);

for(

int i=

1;i<=m;

++i)

sort

(a +

1, a + m +

1, cmp)

;reverse

(a +

1, a + m +1)

;long

long res =0;

for(

int i=

1;i<=m;

++i)

cout << res << endl;

return0;

}

LCA 樹鏈剖分

剛打完lca板子,寫個東西記下 dfs第一遍求出 結點i的深度,以i為根的子樹大小,結點i的父親,並求出重鏈 dfs第二遍求出 結點i所在重鏈的鏈頂 如果在重鏈上 開始lca,兩個點往上找,深度大的點就往上跳,這個點如果在重鏈上,就跳到所在重鏈的鏈頂的父親處,在輕鏈上,就直接跳到自己父親上 洛谷lc...

樹鏈剖分求LCA

這裡先推薦兩道練習的裸題 首先是求點 codevs4605 lca 就是求兩個點的公共祖先,每次詢問xor上上乙個詢問的答案。先是兩遍dfs dfs1 把dep siz son求出來 dfs2 求出top和w siz v 表示以v為根的子樹的節點數 dep v 表示v的深度 根深度為1 top v ...

樹鏈剖分求lca

題目描述 給一棵有根樹,以及一些詢問,每次詢問樹上的2 個節點a b,求它們的最近公共祖先.輸入第一行乙個整數n.接下來n 個數,第i 個數fi 表示i 的父親是fi.若fi 0,則i 為樹根.接下來乙個整數m.接下來m 行,每行2 個整數a b,詢問節點 a xor lastans bxor la...