洛谷2021五月月賽題解
摸幾下發現對於某乙個 k,s 只要在乙個區間內,他總是能被湊出來的,考慮這個區間左右端點,不過就是考慮最大值和最小值,可以想到最小值就是 [1,k] 的和,最大值就是 [n-k+1,n] 的和
還不會有 1 為根節點,那麼我們可以 o(n) 獲得每一層的節點
然後考慮一層一層的搞,設相鄰兩層的節點數為 $n_i$ 和 $n_j$,我們有乙個很顯然的想法就是對於第 i 層的每乙個節點,我們遍歷所有的 j 層節點,並且用詢問1搞出距離,這樣距離為 1 的點就是他的兒子,複雜度 $o(n_in_j)$
可以發現這種做法可以被卡到 $o(n^2)$
考慮詢問2來做這題
對於每一層的每乙個節點,都詢問他子樹的節點。在這個點集裡,位於下一層的節點就是他的兒子。那麼複雜度是多少,我們可以發現在同一層裡的詢問是互不相交的,所以假設樹有 k 層,總複雜度是 $o(kn)$
後者做法有乙個好處,就是不管某一層有多少個點,他處理一層的複雜度總是 o(n)
那麼兩者結合一下,當用前者做法優於後者時,用前者做法,否則用後者做法,可以發現處理一層的複雜度是 $o(\min(n_in_j,n))$
那麼總複雜度是多少?考慮最壞情況,每一層都是 $o(\sqrt n)$ 個節點,那麼每一層都會被卡滿到 o(n),但是我們這時只有 $o(\sqrt n)$ 層
所以總複雜度 $o(n\sqrt n)$
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#define inf 5010
#define inf 0x7fffffff
#define ll long longstd::vector
depset[inf];
std::vector
q;intn;
intmaxdep;
intfa[inf], dep[inf];
inline
int querydist(int x, int
y) inline
int querytree(int
x)
return
sz;}
inline
void distfind(int
d) }
}inline
void treefind(int
d) }
}signed main()
for(int i = 1; i < maxdep; i++)
for(auto i: depset[1]) fa[i] = 1
; printf("!
");for(int i = 2; i <= n; i++)
fflush(stdout);
return0;
}
五月槐花香
五一勞動節,帶孩子回老家一趟。從繁華都市來到安靜的鄉村,時空的轉換讓人立刻覺得心曠神怡起來。坐在汽車上放眼望去,到處是綠色的麥田,春風拂面,野花野草,算黃算割的叫聲,一切都那麼生機勃勃。那山 那水 那橋,依舊那樣熟悉。路上碰到村里的熟人,不時的打著招呼。芊芊一路上都很興奮,看到麥田,說 好大的草地啊...
五月的孩子
五月有輕巧的陽光,微風閃爍細細的光澤。花事一波未平,一波又起。燕子 樹鶯 喜鵲且歌且舞。小雨一場一場地下,青青草尖 片片綠葉都很認真地生長。空氣中有蓬勃的律動。男人抱著自己的小小孩。小小孩手指向頭頂的樹葉,男人伸手摘下一片綠葉。可他不滿意,還是伊伊呀呀仰頭看著樹上。不知道他心中理想的葉子是什麼標準的...
五月的行走
下了車,陽光像電影的乙個降格鏡頭,慢慢的融入,滲透。在城市。不管你有多麼柔軟的內心,人和砼的對峙始終都蘊含著繁華和寂寞的落差。在高大的建築下面行走,仰望所帶來的假象和夢想一樣。我總是在特定的時間出現在這條馬路上,行走對我來說總是最值得愜意的事情。我喜歡在行走的路上看見人類,寶馬車的呼嘯以及建築的破舊...