bzoj 4401 塊的個數(樹分塊)

2021-09-11 05:06:56 字數 2904 閱讀 3221

一種特殊的分塊型別———樹分塊,與數列分塊有很大差別,基本都是將樹分成好幾個塊。

對於此題,有兩個結論:

1、一棵樹劃分成 k

kk 份的方案是唯一的(但可以不存在);

2、一棵樹可以劃分成 k

kk 份,當且僅當有 k

kk 個子節點的子樹大小是 n

k\frac

kn​ 的倍數

所以只要 dfs

dfsdf

s 求出每個節點為根的子樹大小(即節點個數),然後列舉分成的塊數即可解決。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std ;

//#define int long long

#define rep(i, a, b) for (int i = (a); i <= (b); i++)

#define per(i, a, b) for (int i = (a); i >= (b); i--)

#define loop(s, v, it) for (s::iterator it = v.begin(); it != v.end(); it++)

#define cont(i, x) for (int i = head[x]; i; i = e[i].nxt)

#define clr(a) memset(a, 0, sizeof(a))

#define ass(a, sum) memset(a, sum, sizeof(a))

#define lowbit(x) (x & -x)

#define all(x) x.begin(), x.end()

#define ub upper_bound

#define lb lower_bound

#define pq priority_queue

#define mp make_pair

#define pb push_back

#define fi first

#define se second

#define iv inline void

#define enter cout << endl

#define siz(x) ((int)x.size())

#define file(x) freopen(#x".in", "r", stdin),freopen(#x".out", "w", stdout)

typedef

long

long ll ;

typedef

unsigned

long

long ull ;

typedef pair <

int,

int> pii ;

typedef vector <

int> vi ;

typedef vector vii ;

typedef queue <

int> qi ;

typedef queue qii ;

typedef set <

int> si ;

typedef map <

int,

int> mii ;

typedef map int> msi ;

const

int n =

1000010

;const

int inf =

0x3f3f3f3f

;const

int iinf =

1<<30;

const ll linf =

2e18

;const

int mod =

1000000007

;const

double eps =

1e-7

;void

print

(int x)

void

print

(string x)

void

douout

(double x)

vi e[n]

;int n, ans ;

int sz[n]

, cnt[n]

;void

dfs(

int x,

int fa)

cnt[sz[x]]++

;}bool

check

(int x,

int y)

signed

main()

dfs(1,

0);for

(int i =

1; i * i <= n; i++)if

(n % i ==0)

printf

("%d\n"

, ans)

;return0;

}/*寫**時請注意:

1.ll?陣列大小,邊界?資料範圍?

2.精度?

3.特判?

4.至少做一些

1.最大值最小->二分?

2.可以貪心麼?不行dp可以麼

3.可以優化麼

4.維護區間用什麼資料結構?

5.統計方案是用dp?模了麼?

6.逆向思維?

*/

BZOJ 4401 塊的計數 樹分塊

首先,塊的大小確定的話,可以發現方案最多只有1種 by神犇wangyurzee7 有了這個結論後就非常好做了,記錄一下當塊的大小為x時,可以做塊的根的數量,即滿足x size i 的i的數量,可以考慮nlogn的線性篩的做法 include include include include inclu...

BZOJ4401 塊的計數

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

bzoj 4401 塊的計數

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