樹形結構基礎

如下 \(n\le 10^5\)spa

1 Codeforces 686D

給你一棵樹,求出這棵樹全部子樹的重心。code

樹的重心性質:遊戲

  1. 以這個點爲根,那麼全部的子樹(不算整個樹自身)的大小都不超過整個樹大小的一半。
  2. 把兩棵樹連起來,新樹的重心一定在原來兩棵樹的重心連線的路徑上。

在dfs的過程當中,咱們利用性質一、2,設當前節點爲 \(u\)\(u\) 的其中一個子節點爲 \(v\) ,若是 \(v\) 的子樹大小超過了 \(u\) 的一半,那麼 \(u\) 的子樹的重心必定在 \(u\)\(v\) 的子樹重心的連線上,咱們從 \(v\) 的子樹重心暴力往上跳,每次檢驗是否合法便可。class

2 Codeforces 191C

給你一棵樹和若干對節點,問對於樹的每條邊,有多少對節點間的路徑通過它。gc

對於每一對點,在這兩個點上打上+1標記,在它們的lca上打上-2標記,最後用樹上差分查詢。統計

3 Codeforces 842C

定義一個節點的美麗值爲從它到根的路徑上的全部點的點權的gcd。有若干個詢問,詢問節點最大可能的美麗值。對於每一個詢問,你能將樹中某一個節點的點權改成0。\(gcd(a,0)=a\)。根節點美麗值爲其點權。
點權 \(\le 10^5\)查詢

咱們發現點權不大,因而在dfs下去的過程當中,咱們維護目前掃過的點的全部因子出現的次數。
設當前節點深度爲 \(d\) ,根節點深度爲0。
在尋找當前數的因子的過程當中,若是有一個因子出現次數 \(≥d\) ,那麼這個因子必然就是當前節點的答案之一。
另外,還要考慮不選當前節點的狀況。
這樣能保證複雜度爲 \(O(n\sqrt{n})\)移動

4 Codeforces 813C

有A,B兩我的在一棵樹上van,A位於1節點,B位於x節點,B先手,每一次A,B能夠移動到相鄰的節點,也能夠不動。當A,B相遇時遊戲結束。如今A想要最小化遊戲次數,B想要最大化遊戲次數。輸出最終的遊戲次數。di

找到知足 \(disB[u]<disA[u]\)\(disA[u]\) 最大的節點便可。co

5 Codeforces 682C

定義一個節點 \(v\) 是傷心的,若是它的子樹中存在一個節點 \(u\) ,使得 \(dis(v,u)>a[u]\) ,其中 \(a[u]\)\(u\) 的點權, \(dis(v,u)\) 爲從 \(v\)\(u\) 路徑上的邊權和。如今你能夠進行若干次操做,每次能夠刪除當前樹中的一個葉節點,問最少刪除幾個節點能使樹中沒有一個節點是傷心的。

對於一個節點 \(u\) ,若是它到根節點的路徑上的某一段邊權後綴和大於它的點權,那麼這個節點必然會使某一個節點傷心,刪除這個節點。dp弄一下。

6 Codeforces 337D

有一本魔書在一棵樹的一個節點上,這棵樹上與它距離不超過 \(d\) 的點會被影響。如今告訴你目前發現已經被影響到的點(可能還有一些點也被影響,但沒有告訴你),請你判斷魔書有多少種可能的位置。沒有輸出0。

找到距離最遠的兩個被影響到的點,計算有多少個點到它們的距離 \(\le d\)

7 Codeforces 782C

給你一棵樹,要給每一個節點染色,要求任意相鄰的三個節點不能是相同的顏色。問最少使用幾種顏色。

對於每一個節點,顏色從1開始++,若是該顏色使用過就跳過。

8 Codeforces 739B

一棵樹,問對於全部的節點,它們各自能控制多少個節點。
節點 \(v\) 能控制節點 \(u\) ,當 \(u\)\(v\) 的子樹中,且 \(dis(v,u)>a[u]\) ,其中 \(a[u]\)\(u\) 的點權, \(dis(v,u)\) 爲從 \(v\)\(u\) 路徑上的邊權和。

咱們發現,對於一個節點 \(u\) ,能控制它的節點一定是它到根節點路徑上的點的一個後綴。因此掃到一個節點 \(u\) 時,咱們二分一個節點 \(v\) ,使 \(v\) 是深度最小的能控制 \(u\) 的節點,而後用樹上差分將從 \(v\)\(u\) 的父親的全部節點都+1,最後統計每一個節點加了幾回。

9 Codeforces 980E

一棵樹,第 \(i\) 個節點的點權爲 \(2^i\) ,如今能夠進行 \(k\) 次操做,每次能夠刪除當前樹的一個葉節點,要最大化剩下節點的點權和。問應該刪除哪些節點。

首先考慮貪心,由於前 \(i-1\) 個節點的點權加起來還沒第 \(i\) 個節點的點權大。
咱們不妨設根節點爲 \(n\) 號節點,而後從大到小枚舉其餘節點,每次檢驗當前節點是否能保留。若是當前節點要保留,那麼它的全部祖先也要保留。然而,保留的節點個數不能超過 \(n-k\) 個。 怎麼統計當前要保留的節點個數?因爲保留的節點是單調的,因此用倍增找到第一個未被標記爲保留的節點,它到當前節點的距離+1就是須要保留的節點個數。

相關文章
相關標籤/搜索