長樂爆零之旅 day5 蘋果樹

2021-08-28 17:48:43 字數 2593 閱讀 6738

這一題是樹上差分和lca,可是沒看出來,一開始直接暴力了。

題目描述:

小 b 是乙個辛勤的農民,他家裡種了一棵很大的蘋果樹。 這棵蘋果樹可以看作一張 n 個點 n-1 條邊的無向連通圖,小 b 覺得這顆蘋果樹很脆弱,因為只要剪斷任意一條邊,蘋果樹就不連通了,於是他給蘋果樹新加了 m 條邊。現在這顆蘋果樹就不像是一棵樹了,成了一張 n 個點 n+m-1 條邊的無向連通圖,小 q是小 b 的好朋友,他覺得這棵樹依然很脆弱,他告訴小 b,自己只要破壞兩條邊,一條是原樹中的邊,一條是小 b 新加的邊,就能使蘋果樹不連通。 小 b 覺得小 q 說得很不可思議,於是他找來了擅長程式設計的你,希望你告訴他,按照小b 的破壞規則,有多少種不同的方案使得蘋果樹不連通。 注意:兩種方案不同當且僅當一條邊在第一種方案中被刪除了但在第二種方案中沒有被 刪除。

輸入格式:

第一行兩個正整數 n,m,表示蘋果樹的點數和後面新加的邊的個數。 接下來 n-1 行,每行兩個正整數 u,v,表示(u,v)之間有一條樹邊。 接下來 m 行,每行兩個正整數 u,v,表示(u,v)之間有一條小 b 新加的邊。

輸出格式:

輸出一行乙個整數,表示有多少種不同的方案。

輸入樣例:

4 11 2

2 31 4

3 4輸出樣例:

題解:這一題打死我也看不出來是樹上差分,那些dalao真是太厲害了。

我們先講講為什麼要用樹上差分(不會樹上差分的話我部落格還沒寫,如果寫了鏈結會放在這個位置),我們先不看新加的邊,如果只是原來的那幾條邊的話,無論斷哪一條都會成立,接下來看看新加的邊,我們可以發現(然而我當時並沒有發現 )如果加了一條邊那麼它起到的作用將與一條鏈,舉個栗子:如果我們在x,y這邊加一條邊,那麼這條邊相當於x到y原樹上的鏈的作用(兩點在樹上只有唯一 一條鏈就不用我說了吧),這樣子我們在加完所有的邊後,我們發現原本樹上的邊起到的作用可能會被不止一條新加的邊替代,那麼我們可以發現,如果這一條邊的作用沒有任何一條新邊代替(意味著這一條邊斷了,整個圖就不連通了),那麼無論另一條我們選哪一條都會不連通,那麼方案數就有m種;如果一條邊的作用剛好被另一條新邊替代,那麼很明顯只要把這兩條都刪了就不連通了,那麼方案數是1;如果有一條邊作用被兩條新邊(或者以上)替代的話,無論怎麼刪除都會聯通,所以這個方案數為0。

接下來我們只要統計一下所有的原邊的作用被多少新邊所替代就ojbk了,下面講怎麼統計。

我們定義乙個much陣列,much[i]表示第i個點到自己父親的那一條邊的作用被多少新邊替代(因為父親只有乙個,所以這樣的邊也只有唯一 一條),然後我們在讀入新邊的時候樹上差分統計就好了。下面上**:

#include

#include

#include

#include

using

namespace std;

int head[

600100

],next[

600100

],ver[

600100

],much[

300100

],size=

0,t,f[

300100][

20],deep[

300100

],n,m,vist[

300100];

//much陣列存對應邊的作用被多少條邊替代

//f陣列存倍增的祖先,即f[i][j]表示i這個節點第2^j個祖先;deep存深度;vist存訪問

queue <

int> q;

//倍增預處理用的

void

add(

int x,

int y)

//邊表常規操作

void

bfs(

)//我們預處理倍增

}return;}

intlca

(int x,

int y)

//詢問兩個點的lca

return f[x][0

];//我們可以確保x,y一定為lca的兒子,直接返回父親

}void

dfs(

int x)

//我們把差分統計一下

}int

main()

bfs();

for(

int i=

1;i<=m;i++

)dfs(1

);//dfs統計差分結果

for(

int i=

2;i<=n;

++i)

//迴圈判斷,much[1]指根到自己父親的,這一條邊其實是不存在的不過我們為了**好打,同一,所以虛擬了這個邊,記得不要加

if(much[i]==1

)//如果有一條邊代替

ans++

;elseif(

!much[i]

)//如果有零條邊代替

ans+

=m;printf

("%lld"

,ans)

;//給波答案

return0;

}

唉,還有兩天國慶就gg了,傷心,藍過。

LeetCode刷題之旅(Day5)

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解題思路 我們觀察到回文中心的兩側互為映象。因此,回文可以從它的中心展開,並且只有 2n 12n 1 ...

國慶長樂醬油之旅day1

2018 10 01 19 51 01成功a掉 評價 普及 提高 思路 首先很容易想到如何判斷兩條線有交點 就是在所給的字串中找到兩個一樣的點 然後在這兩個點之間搜尋 記錄兩點之間所有點出現的次數,判斷是否為偶數即可 然而這是片面的 我們需要找兩個一樣的點也是有限制的,我們要處理一下。同時我們在記錄...

java之旅 day5 資料庫入門

萬里之行,起於足下 選擇資料庫 learn use learn 選擇表名為user的sql語句 use user 列出所有資料庫 show databases 修改資料update 表的名字 set 列名 值,列名 值,where過濾條件 update user set age 18 where p...