思維題 集合hash 樹上差分 11 5擼樹

2022-05-20 03:32:32 字數 2105 閱讀 9818

要注重問題的轉化和一些結論的推斷

要致富,先擼樹。

一棵樹的形狀可以簡化為一張 $n$ 個點 $m$ 條邊的圖,由於裝備條件限制,你只有擼兩次,也就是刪去兩條邊,當這張圖不聯通時,就意味著樹倒了。

現在你想知道有多少種方案能擼倒這棵樹。

第一行兩個正整數 $n,m$

接下來 $m$ 行,每行兩個正整數,表示一條邊。

輸出乙個數,表示方案數。

對於 $30\%$ 的資料,$1\le n\le 20,1\le m\le40$

對於$50\%$的資料,$1\le n\le500,1\le m\le1000$

對於$100\%$的資料,$1\le n\le50000,1\le m\le100000$

保證剛開始圖是聯通的。

時間限制:1s

空間限制:512m

重邊

圖的問題先轉化為樹,於是

先預處理出樹邊與非樹邊,再來考慮非樹邊對於樹的影響。

首先是一些定義:對每一條,如果是樹邊就使用雜湊記錄下經過它的非樹邊,並將這個雜湊值稱作「經過雜湊值」、邊的數量稱作「經過數」;如果是非樹邊,「經過雜湊值」就是它的雜湊值本身、「經過數」不計。

然後是結論:若一條邊(樹邊)的經過數為0(也就意味著它是一條割邊),說明選了它再任選一條邊都可行;若兩條的經過雜湊值相同,意味著必須同時取兩條這種邊才能將圖分為兩半。

接下去考慮演算法實現。

注意到這裡雜湊是集合雜湊,那麼一種經典方法就是rand乙個大數(long long),再異或起來。對於一條非樹邊$(u,v)$,我們需要把樹上路徑$u->v$這一段都加上標記,因此考慮樹上差分。這裡有乙個小技巧,因為此處操作是異或,而兩端點同時異或乙個相同的數,那麼就不用像常規那樣求出lca並除去貢獻,只需要在打完標記之後再從上至下dfs一遍記錄每一條邊的雜湊值。

還有乙個處理的技巧:將雜湊開成unsigned long long;雙雜湊開std::pair。如此一來排序時候就自然而然將經過數為0的邊排在前面,天然保證了答案的順序。

1 #include2 typedef unsigned long

long

ll;3 typedef std::pairpr;

4const

int maxn = 50035;5

const

int maxm = 200035;6

7struct

edge811

}edges[maxm];

12int

n,m,u[maxm],v[maxm],fa[maxn];

13int

edgetot,head[maxn],nxt[maxm];

14pr eval[maxm],ev[maxn];

15ll ans;

1617

intread()

1829 pr operator ^(pr a, pr b)

30int

get(int x)

31void addedge(int u, int v, int

id)32

36void count(int x, int

fa)3744}

45int

main()

46else60}

61for (int i=1; i<=m; i++)

62if (eval[i].first||eval[i].second)

65 count(1, 0

);66 std::sort(eval+1, eval+m+1

);67

for (int i=1, j=0; i<=m; i=j)

6875

}76 printf("

%lld\n

",ans);

77return0;

78 }

end

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

點的樹上差分 若經過 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 輸出格式 一行,更新後的陣列 樣例...

差分總結二 樹上差分

找這個樹上 重複經過的最多點 經過幾次 看這名字 就醉了orz 這題是 樹上差分 模板題 點差分 點差分的話 由於 lca 本身是有貢獻的 那麼d lca 用d lca父親 只要消掉影響 include using namespace std const int maxn 1e5 10 int n,...