一種特殊的分塊型別———樹分塊,與數列分塊有很大差別,基本都是將樹分成好幾個塊。
對於此題,有兩個結論:
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...