天哪這道題竟然只有一篇題解!
emm,首先讀題看完兩個操作就已經有很明確的思路了,顯然是並查集+樹的直徑 一波解決。
並查集不多說了,如果不了解的可以看這裡.
樹的直徑的思路很樸實,就是兩邊dfs(bfs也ok)。具體先隨便找乙個節點,然後搜一遍,找到最遠的,然後再搜一遍,這樣合在一起就一定是最長的了。
不過呢這道題還是注意一下求直徑的公式,具體如下:
$d_new=max(d_u,d_v,[d_u/2]+[d_v/2]+1)$
那個方括號指的是取整(沒找到在**打出來)。
en除此之外好像沒什麼好說的。。。
ac**如下:
1 #include2 #include3 #include4 #include5using
namespace
std;67
const
int maxn=300300;8
9int
n,m,q,max_i,max_v;
10int
f[maxn],len[maxn],sz[maxn];
11bool
used[maxn];
12 vectorg[maxn];
1314
void dfs(int val,int depth,int
pos)
19for(int i=0;i)22}
2324
int calc(int
val)
3132
int find(int
x)36
37void merge(int x,int
y)43
44int radius(int
x)47
48void merge2(int x,int
y)56
57int
main()
64for(int i=1;i<=m;i++)
71for(int i=1;i<=n;i++)77}
78while(q--)else88}
89 }
題解 洛谷 P4074 WC2013 糖果公園
p4074 wc2013 糖果公園 給你一棵樹樹,點有點權,帶修改,每一次經過一種點權會有不同的貢獻 隨著經過次數再變 問你從乙個點到乙個點的貢獻和 樹上帶修莫隊。用 cnt i 表示 i 這個點的權值的出現次數。用 a i 表示 i 號點的權值。用 v i 表示一權值 i 的貢獻定值。用 v i ...
題解 洛谷P4513 小白逛公園(線段樹)
這裡要對某個葉子節點的值進行修改,最後求某一段區間內的某一段和的最大值,可以用線段樹來解決,但需要多開一些陣列儲存更多的資訊。我們定義ln陣列記錄某個結點從左開始某一段區間和的最大值,定義rn陣列為某個結點從右開始某一段區間和的最大值,定義midd陣列記錄某個結點在中間的某一段區間和的最大值,sum...
洛谷比賽 P5011 水 造題 題解
暴力就是o k n o kn 吧,不過n n非常之大,有101 0610 106 高精可怕.jpg 但是我們發現,對於求期望,那麼就是概率 權值,所以我們可以先求出每種動作的貢獻 每種動作出現在某個位置的概率為1kk 1 貢獻為它的val val,總共有n n個可以出現的位置,所以貢獻為 i 0k ...