點此看題面
大致題意:給定一棵樹,每個節點有乙個顏色,定義\(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...