首先隨便選乙個根進行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很想知道,能有幾種分割...