P2664 樹上遊戲 (點分治)

2021-10-07 21:53:18 字數 2596 閱讀 5382

題目鏈結

題面:題解:點分治。

考慮當前點分治子樹的根節點為p。

那麼我們需要處理兩部分貢獻。

①、所有節點對點p的貢獻(包括p節點自己)

②、經過點p的路徑(x,y)對x點的貢獻。

第一類貢獻:

如果乙個節點 x 的顏色 color [ x ] 在它到根節點 p 的路徑上是第一次出現,那麼以 x 為根的子樹上的每個節點,都可以對節點 p 產生貢獻,那麼一共產生了 size [ x ] 的貢獻。

為方便我們最後計算和統計答案,我們把所有這樣的貢獻加起來記為sum。顯然該當前分治子樹上所有節點對p的貢獻和就是sum。即 ans[p]+=sum。

void

dfs_sum

(int x,

int fa)

if(cnt[vi[x]]==

1)cnt[vi[x]]--

;}

第二類貢獻。假設當前考慮點經過p的路徑對點x的貢獻

我們將第二類貢獻分為兩部分

第一部分:

路徑p–x出現的顏色對x點的貢獻(不包括p點)。這一部分的貢獻為 (size[ p ] - size[ sonp ] ) * res

其中 sonp 為 p 的兒子且為 x 的祖先,res為p–x出現的顏色種類數(不包括p點)。

第二部分:

除了 sonp 以外子樹上新出現的顏色對 x 的貢獻,我們求出了sum,所有節點對p的貢獻,那麼我們需要減去sonp子樹中對sum的貢獻,然後再減去p–x出現的顏色對sum的貢獻(不包括p點),此時的sum就是sonp以外子樹新出現的顏色對x的貢獻

void

dfs_ans

(int x,

int fa)

ans[x]

+=sum+res*six_xiy;

for(

int i=head[x]

;i;i=nt[i])if

(cnt[vi[x]]==

1)cnt[vi[x]]--

;}

**:

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define llu unsigned ll

#define pr make_pair

#define pb push_back

using

namespace std;

const

int maxn=

100100

;const

int inf=

0x3f3f3f3f

;int head[maxn]

,ver[maxn<<1]

,nt[maxn<<1]

;int max_part[maxn]

,si[maxn]

,vi[maxn]

,c[maxn]

,cnt[maxn]

;bool ha[maxn]

;int tot=

1,root,max_size,n;

ll ans[maxn]

,sum,res,six_xiy;

void

add(

int x,

int y)

void

dfs_size

(int x,

int fa)

}void

dfs_root

(int now_root,

int x,

int fa)

for(

int i=head[x]

;i;i=nt[i])}

void

dfs_sum

(int x,

int fa)

if(cnt[vi[x]]==

1)cnt[vi[x]]--

;}void

change

(int x,

int fa,

int val)

if(cnt[vi[x]]==

1)cnt[vi[x]]--

;}void

dfs_ans

(int x,

int fa)

ans[x]

+=sum+res*six_xiy;

for(

int i=head[x]

;i;i=nt[i])if

(cnt[vi[x]]==

1)cnt[vi[x]]--

;}void

dfs_clear

(int x,

int fa)

}void

do_it

(int x)

dfs_clear

(x,0);

}void

dfs(

int x)

}int

main

(void

)

P2664 樹上遊戲

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

P2664 樹上遊戲

題面 作為一道經典的點分治題目,此題能很好的考察對點分治的運用。個人認為點分治的本質在於 對於樹上近乎n2 的路徑詢問,通過有效的 劃分,使之能在穩定的時間內通過儲存資訊 獲取資訊的經典方式來求 出答案。由此看出點分治的關鍵在於儲存資訊與獲取資訊的方式。點分治的模板套上之後我們只需要考慮的是子樹與子...

洛谷 P2664 樹上遊戲

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