首先不難發現乙個結論:
因此我們可以將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...