BZOJ4401 塊的計數

2022-05-03 23:18:20 字數 1323 閱讀 4786

小y最近從同學那裡聽說了乙個十分牛b的高階資料結構——塊狀樹。聽說這種資料結構能在sqrt(n)的時間內維護樹上的各種資訊,十分的高效。當然,無聊的小y對這種事情毫無興趣,只是對把樹分塊這個操作感到十分好奇。他想,假如能把一棵樹分成幾塊,使得每個塊中的點數都相同該有多優美啊!小y很想知道,能有幾種分割方法使得一棵樹變得優美。小y每次會畫出一棵樹,但由於手速太快,有時候小y畫出來的樹會異常地龐大,令小y感到十分的苦惱。但是小y實在是太想知道答案了,於是他找到了你,乙個天才的程式設計師,來幫助他完成這件事。

第一行乙個正整數n,表示這棵樹的結點總數,接下來n-1行,每行兩個數字x,y表示編號為x的結點與編號為y的結點相連。結點編號的範圍為1-n且編號兩兩不同。

一行乙個整數ans,表示所求的方案數。

61 2

2 32 4

4 55 6

3100%的資料滿足n<=1000000。

那麼如果暴力列舉k判斷是o(n*sqrt(n))的,顯然不是正確姿勢。

發現問題可以等價於判斷有多少子樹的大小為k的倍數。

預處理然後判判就是o(nlogn)了。

#include#include

#include

#include

#include

#include

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define dwn(i,s,t) for(int i=s;i>=t;i--)

#define ren for(int i=first[x];i;i=next[i])

using

namespace

std;

const

int buffersize=1

<<16

;char buffer[buffersize],*head,*tail;

inline

char

getchar()

return *head++;

}inline

intread()

const

int maxn=1000010

;int n,s[maxn],first[maxn],next[maxn<<1],to[maxn<<1

],e;

void addedge(int u,int

v) int dfs(int x,int

fa)

inta[maxn],ans;

intmain()

printf(

"%d\n

",ans);

return0;

}

view code

BZOJ4401 塊的計數

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

bzoj 4401 塊的計數

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

bzoj4401 塊的計數

首先,塊的大小確定的話,可以發現方案最多只有1種 然後就可以o nsqrt n 搞,不過會tle 接著我們又發現,乙個節點可以作乙個塊的根,當且僅當該節點的size能被塊的大小整除 然後就可以o nlogn 搞了 include include include include include inc...