洛谷2664 樹上遊戲(點分治)

2022-05-14 15:39:09 字數 2008 閱讀 8063

點此看題面

大致題意:給定一棵樹,每個節點有乙個顏色,定義\(s(i,j)\)為\(i\)到\(j\)路徑上顏色數量,請你對於每乙個\(i\)求出\(\sum_^n s(i,j)\)。

這種題目比較顯然是點分治吧... ...

首先,按照點分治的基本套路,對於一棵子樹內的路徑,我們分兩種情況討論:

呃,第二種情況就按照點分治繼續處理下去就可以了,因此忽略不提。

而對於第一種情況的邊,我們又可以分為兩類:

接下來就按此分類處理即可。

首先,我們需要先來一波定義。

\(sum\):所有顏色造成的總貢獻。

\(col_i\):節點\(i\)的顏色。

\(val_i\):顏色\(i\)對答案造成的貢獻。

\(size_i\):以節點\(i\)為根的子樹大小。

接下來便是對第二類路徑的處理。我們考慮對於根節點的每一棵子樹如何計算其貢獻值。

好吧,還有乙個很重要的細節:注意清空陣列。

#include#define max(x,y) ((x)>(y)?(x):(y))

#define min(x,y) ((x)<(y)?(x):(y))

#define uint unsigned int

#define ll long long

#define ull unsigned long long

#define swap(x,y) (x^=y,y^=x,x^=y)

#define abs(x) ((x)<0?-(x):(x))

#define inf 1e9

#define inc(x,y) ((x+=(y))>=mod&&(x-=mod))

#define ten(x) (((x)<<3)+((x)<<1))

#define n 100000

#define add(x,y) (e[++ee].nxt=lnk[x],e[lnk[x]=ee].to=y)

using namespace std;

ll n,ee=0,lnk[n+5],col[n+5];

struct edge

e[(n<<1)+5];

class fio

inline void read(ll &x)

inline void read_char(char &x)

inline void read_string(string &x)

inline void write(ll x)

inline void write_char(char x)

inline void write_string(string x)

inline void end()

}f;class class_dotsolver//點分治

inline void clear(ll x,ll lst)//清空陣列

inline void init(ll x,ll lst)//初始化出子樹大小和貢獻

inline void change(ll x,ll lst,ll flag)//刪除(flag=0)or 恢復(flag=1)一棵子樹中顏色造成的貢獻

inline void f5(ll x,ll lst,ll other)//更新一棵子樹中的ans

inline void solve(ll x)//處理以x為根的子樹

for(i=lnk[x],sum=color_tot=0,clear(x,0);i;i=e[i].nxt)//清空

if(!used[e[i].to]) getrt(e[i].to,rt=0,size[e[i].to]),solve(rt);//繼續處理子樹資訊

}public:

class_dotsolver()

ll ans[n+5];

inline void getans()

}dotsolver;

int main()

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 不...

洛谷 P2664 樹上遊戲 解題報告

text 有一棵樹,樹的每個節點有個顏色。給乙個長度為 n 的顏色序列,定義 s i,j 為 i 到 j 的顏色數量。以及 sum i sum limits ns i,j 現在他想讓你求出所有的 sum i 第一行為乙個整數 n 表示樹節點的數量 第二行為 n 個整數,分別表示 n 個節點的顏色 c...