題目鏈結
題面:題解:點分治。
考慮當前點分治子樹的根節點為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 不...