暗 鎖(樹上差分)

2021-10-02 09:25:08 字數 1846 閱讀 6027

傳說中的暗之連鎖被人們稱為 dark。

dark 是人類內心的黑暗的產物,古今中外的勇者們都試圖打倒它。

經過研究,你發現 dark 呈現無向圖的結構,圖中有 n 個節點和兩類邊,一類邊被稱為主要邊,而另一類被稱為附加邊。

dark 有 n – 1 條主要邊,並且 dark 的任意兩個節點之間都存在一條只由主要邊構成的路徑。

另外,dark 還有 m 條附加邊。

你的任務是把 dark 斬為不連通的兩部分。

一開始 dark 的附加邊都處於無敵狀態,你只能選擇一條主要邊切斷。

一旦你切斷了一條主要邊,dark 就會進入防禦模式,主要邊會變為無敵的而附加邊可以被切斷。

但是你的能力只能再切斷 dark 的一條附加邊。

現在你想要知道,一共有多少種方案可以擊敗 dark。

注意,就算你第一步切斷主要邊之後就已經把 dark 斬為兩截,你也需要切斷一條附加邊才算擊敗了 dark。

輸入格式

第一行包含兩個整數 n 和 m。

之後 n – 1 行,每行包括兩個整數 a 和 b,表示 a 和 b 之間有一條主要邊。

之後 m 行以同樣的格式給出附加邊。

輸出格式

輸出乙個整數表示答案。

資料範圍

n

≤100000,m

≤200000,數

據保證答

案不超過

231−1

n≤100000,m≤200000,資料保證答案不超過2^−1

n≤1000

00,m

≤200

000,

資料保證

答案不超

過231

−1輸入樣例:

4 11 2

2 31 4

3 4輸出樣例:

3提公升很大的一道題,這道題首先讀題想了很久,我們有哪些情況呢?首先我們當樹上樹邊和非樹邊構成乙個環的時候樹邊需要加1,這個1代表的是我們把這個邊砍掉後還需要砍1條和這個環構成的非樹邊才能形成一種方案,如果樹邊大於等於2那麼我們是沒辦法的,如果這個樹邊是0,那麼我們只要砍掉他再隨便砍一條非樹邊都是可以的。所以我們怎麼快速給樹邊加1成了關鍵,這裡就用到了樹上差分了。最後dfs求字首和就行了再判斷當前邊的差分值就可以了。

#include

using

namespace std;

const

int n=

5e5+7;

int fa[n][17

],ne[n]

,e[n]

,w[n]

,head[n]

;int n,m,d[n]

,depth[n]

;int res,cnt;

void

add(

int a,

int b)

void

bfs()}

}}}int

lca(

int a,

int b)

if(a==b)

return a;

for(

int i=

16;i>=

0;i--)}

return fa[a][0

];}int

dfs(

int u,

int fa)

return sum;

}int

main()

bfs();

for(

int i=

1;i<=m;i++

)dfs(1

,-1)

;printf

("%d\n"

,res)

;}

暗 鎖 樹上LCA 樹上差分

傳說中的暗之連鎖被人們稱為 dark。dark 是人類內心的黑暗的產物,古今中外的勇者們都試圖打倒它。經過研究,你發現 dark 呈現無向圖的結構,圖中有 n 個節點和兩類邊,一類邊被稱為主要邊,而另一類被稱為附加邊。dark 有 n 1 條主要邊,並且 dark 的任意兩個節點之間都存在一條只由主...

樹上差分的整理(點的樹上差分和邊的樹上差分)

點的樹上差分 若經過 u 到 v 的所有點,tmp u tmp v tmp lca u,v tmp parent lca u,v 0 例題 include using namespace std struct ss ss data 600010 int n,q int a 300010 head 6...

差分 樹上差分略解

差分 樹上差分略解 哈哈差分?先來看一道題 題目描述 給定包含 n個數的陣列 a1,a2,an.有 k次操作 每次操作把區間 l,r 加上v 最後求出數列每個位置的數。輸入格式 第一行,n.第二行,a1,a2,an下一行,k,下k行,每行乙個操作,格式為l,r,v 輸出格式 一行,更新後的陣列 樣例...