題解 P2195 HXY造公園

2022-05-03 17:42:12 字數 1044 閱讀 6675

天哪這道題竟然只有一篇題解!

emm,首先讀題看完兩個操作就已經有很明確的思路了,顯然是並查集+樹的直徑 一波解決。

並查集不多說了,如果不了解的可以看這裡.

樹的直徑的思路很樸實,就是兩邊dfs(bfs也ok)。具體先隨便找乙個節點,然後搜一遍,找到最遠的,然後再搜一遍,這樣合在一起就一定是最長的了。

不過呢這道題還是注意一下求直徑的公式,具體如下:

$d_new=max(d_u,d_v,[d_u/2]+[d_v/2]+1)$

那個方括號指的是取整(沒找到在**打出來)。

en除此之外好像沒什麼好說的。。。

ac**如下:

1 #include2 #include3 #include4 #include5

using

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