bzoj4401 塊的計數 dfs

2021-07-09 23:29:42 字數 555 閱讀 5440

首先隨便選乙個根進行dfs得到size[x]表示以x為根節點的子樹的大小。然後我們假設答案為t,需要判斷t是否可行。首先顯然需要t|n。顯然每乙個塊有且僅有乙個根,定義為這個塊的最高點。然後我們發現乙個點x是塊的根的必要條件是t|size[x]!這個是顯然的。然後我們統計有多少個size[x]被t整除,如果與n/t相同則合法,否則一定小於n/t,因此一定不合法。

時間複雜度o(n+n^0.5logn)。

ac**如下:

#include#include#define n 1000005

using namespace std;

int n,tot,fst[n],pnt[n<<1],nxt[n<<1],sz[n],sum[n];

void add(int aa,int bb)

void dfs(int x,int last) }}

int read()

return x;

}int main(){

n=read(); int i;

for (i=1; i

by lych

2016.2.16

BZOJ4401 塊的計數

description 小y最近從同學那裡聽說了乙個十分牛b的高階資料結構 塊狀樹。聽說這種資料結構能在sqrt n 的時間內維護樹上的各種資訊,十分的高效。當然,無聊的小y對這種事情毫無興趣,只是對把樹分塊這個操作感到十分好奇。他想,假如能把一棵樹分成幾塊,使得每個塊中的點數都相同該有多優美啊!小...

bzoj 4401 塊的計數

根據塊狀樹的那堆理論可以發現,對於某種塊大小,可行的分法只有一種 如果乙個點能被當成塊頂,僅當其子樹大小是塊大小的倍數 於是列舉塊的大小 i 當可行的塊頂個數大於等於 n i 時,就可以構造出可行的分法了 時間複雜度 o sum d include define n 2010000 using na...

BZOJ4401 塊的計數

小y最近從同學那裡聽說了乙個十分牛b的高階資料結構 塊狀樹。聽說這種資料結構能在sqrt n 的時間內維護樹上的各種資訊,十分的高效。當然,無聊的小y對這種事情毫無興趣,只是對把樹分塊這個操作感到十分好奇。他想,假如能把一棵樹分成幾塊,使得每個塊中的點數都相同該有多優美啊!小y很想知道,能有幾種分割...