P2664 樹上遊戲

2022-05-07 21:06:11 字數 2436 閱讀 3320

題面

作為一道經典的點分治題目,此題能很好的考察對點分治的運用。

個人認為點分治的本質在於:對於樹上近乎n2 的路徑詢問,通過有效的

劃分,使之能在穩定的時間內通過儲存資訊——獲取資訊的經典方式來求

出答案。

由此看出點分治的關鍵在於儲存資訊與獲取資訊的方式。

點分治的模板套上之後我們只需要考慮的是子樹與子樹間產生的貢獻。

往往的套路是我們將當前子樹之外子樹和根的資訊通過特定的方式儲存,

然後再可以對於當前子樹中的節點統計其到儲存資訊對應的節點的路徑的答案

關於這一題,題目中給了每個節點種類達到 n 的級別的乙個屬性。因

此往往使

人覺得十分棘手。拋開百分百錯誤的暴力做法,考慮如何利用點分治的優秀劃分

方式使問題可做處理。

考慮點分治過程中計算一條由根出發的路徑的貢獻,因為屬性相同只能計算一

次(關於此類統計有一種常用套路:我們使統計的方式唯一化,即我們定義一種方

式使得每一種貢獻只在某一特定的情況下被統計。)對於此題我們使得每條路路徑

中每種屬性只在它第一次出現時被統計。

那麼考慮如何統計使之便於其它子樹中的節點查詢進而統計答案。因為統計的

一般路徑都是由一條由根出發的路徑與一條由根的子樹出發的路徑合併而成。所以

統計還可能有重複,所以我們還需要抉擇一下在哪統計(此時一種屬性最多只有兩

次被統計)。

因為深搜處理答案的時候當前子樹的資訊時常變動所以將在當前子樹種出現的

屬性特殊處理較為方便。

具體細節並不想寫......

1 #include2

#define ll long long

3using

namespace

std;

4int

n,x,y,tot,root;

5int head[100050];6

int nex[200050];7

int ver[200050];8

int col[100050];9

int siz[100050

];10 ll val[100050

];11 ll ans[100050

];12

int maxn[100050

];13

bool vis[100050

];14

bool vic[100050

];15

int t[100050

],top;

16ll sumval;

17void add(int x,int

y)18

23void getroot(int u,int fa,int

siz)

2433 maxn[u]=max(maxn[u],siz-siz[u]);

34if(maxn[u]u;35}

36void calc(int u,int fa,int

opt)

3744 siz[u]=1;45

for(int i=head[u];i;i=nex[i])

46if(ver[i]!=fa&&!vis[ver[i]])

4751

if(flag)

5259}60

void work(int u,int fa,ll sum,int sizoutside,int

tot)

6170 ans[u]+=(ll)tot*sizoutside+sum;

71for(int i=head[u];i;i=nex[i])

72if(ver[i]!=fa&&!vis[ver[i]])

73work(ver[i],u,sum,sizoutside,tot);

74if

(flag)

75 vic[col[u]]=false;76

}77void dfs(int

u)78

96while

(top)

97101 sumval=0

;102

for(int i=head[u];i;i=nex[i])

103if(!vis[ver[i]])

104109

}110

intmain()

111maxn[0]=n+1

;120 getroot(1,0

,n); dfs(root);

121for(int i=1;i<=n;++i)

122 printf("

%lld\n

",ans[i]);

123return0;

124 }

view code

P2664 樹上遊戲

分析 點分治。首先關於答案的統計轉化成計算每個顏色的貢獻。1 計算從根出發的路徑的答案 如果某乙個顏色是從根到這個點的鏈上的第一次出現的,那麼這個顏色會對根產生siz x 個貢獻。根連向它子樹的任意乙個點的路徑都包含這個顏色 2 計算子樹內每個點過根的路徑答案 記錄乙個陣列sum i 表示從根出發包...

P2664 樹上遊戲 (點分治)

題目鏈結 題面 題解 點分治。考慮當前點分治子樹的根節點為p。那麼我們需要處理兩部分貢獻。所有節點對點p的貢獻 包括p節點自己 經過點p的路徑 x,y 對x點的貢獻。第一類貢獻 如果乙個節點 x 的顏色 color x 在它到根節點 p 的路徑上是第一次出現,那麼以 x 為根的子樹上的每個節點,都可...

洛谷 P2664 樹上遊戲

lrb有一棵樹,樹的每個節點有個顏色。給乙個長度為n的顏色序列,定義 s i,j 為 i 到 j 的顏色數量。以及 sum i sum s i,j 現在他想讓你求出所有的 sum i 這題真是難,點分治神題 我們考慮乙個性質,對於乙個點 i 如果它的顏色在到根的路徑中是第一次出現,那麼對於和 i 不...