2889: Tree Conundrum

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 61  Solved: 37
[Submit][Status][Discuss]

Description

给定一棵N个节点的无根树,现要求有多少种合法的分块方案。
 所谓合法的分块方案,就是将树分为若干个连通块,满足每个连通块内点数相同。

Input

第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相连。结点编号的范围为1-N且编号两两不同。
注意该题程序以及输入输出文件名。

Output

 
一行一个整数Ans,表示所求的方案数。

Sample Input

6
1 2
2 3
2 4
4 5
5 6

Sample Output

3
【数据规模和约定】
10%的数据满足N<=16,
30%的数据满足N<=100,
50%的数据满足N<=50000,
100%的数据满足N<=1000000。
 
 
    之前做过一道类似的树分块的题目所以才有一些思路。
    首先,对于每一种块的大小,方案要么没有,要么只有一种,接下来我来证明这一点。
   
    对于一种块的大小i,如果要有方案,那么先得保证i是n的约数,并且 子树siz 是i倍数的点 的个数必须正好是 n/i。
    为什么呢?
    考虑把那些siz是i倍数的点 在原树中建成一颗类似虚树的树(虚树里只有 siz 是i倍数的点,并且每个点向祖先第一个也是虚树中的点连边),在虚树中每个点的siz肯定要大于所有子节点的siz和(因为它自己也要算啊),并且每个叶子节点的siz是i,所以在虚树中一个大小是u的子树最多只能有u/i个节点,于是我们论证了虚树中的点个数<=n/i。
   
    那么虚树中点的个数正好是n/i的时候一定有解,并且小于的时候一定无解呢?
    对于第一个问题,我们还是考虑虚树中的点和它们的儿子的关系,我们用一个点的子树减去它所有儿子的子树所得到的联通块大小一定是i的倍数,并且如果正好有n/i个节点的话,那么正好可以证明每个联通块的大小都是i;
    对于第二个问题,我们可以发现只有siz是i倍数的点可以作为联通块的lca,所以小于的时候一定无解。
 
    如果上面的看懂了,那么方案的唯一性就不难证明了。因为我们选联通块的策略是唯一的,所以对于一种块的大小的方案也是唯一的。
 
#include<bits/stdc++.h>
#define ll long long
const int maxn=1000005;
using namespace std;
int to[maxn*2],ne[maxn*2],hd[maxn];
int num,n,ans,k,siz[maxn],N[maxn];
inline void add(int x,int y){ to[++num]=y,ne[num]=hd[x],hd[x]=num;}
inline int read(){
int x=0; char ch=getchar();
for(;!isdigit(ch);ch=getchar());
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
return x;
} void dfs(int x,int fa){
siz[x]=1;
for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa) dfs(to[i],x),siz[x]+=siz[to[i]];
N[siz[x]]++;
} int main(){
scanf("%d",&n); int uu,vv;
for(int i=1;i<n;i++) uu=read(),vv=read(),add(uu,vv),add(vv,uu);
dfs(1,-1); for(int i=1,now;i<=n;i++) if(!(n%i)){
now=0;
for(int j=i;j<=n;j+=i) now+=N[j];
if(now*i==n) ans++;
} printf("%d\n",ans);
return 0;
}

  

bzoj 2889: Tree Conundrum的更多相关文章

  1. bzoj 2212 Tree Rotations

    bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...

  2. bzoj 2631: tree 动态树+常数优化

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1716  Solved: 576[Submit][Status] Descrip ...

  3. [BZOJ - 2631] tree 【LCT】

    题目链接:BZOJ - 2631 题目分析 LCT,像线段树区间乘,区间加那样打标记. 这道题我调了一下午. 提交之后TLE了,我一直以为是写错了导致了死循环. 于是一直在排查错误.直到.. 直到我看 ...

  4. [BZOJ 3282] Tree 【LCT】

    题目链接:BZOJ - 3282 题目分析 这道题是裸的LCT,包含 Link , Cut 和询问两点之间的路径信息. 写代码时出现的错误:Access(x) 的循环中应该切断的是原来的 Son[x] ...

  5. BZOJ 2654: tree( 二分 + MST )

    我们给白色的边增加权值 , 则选到的白色边就会变多 , 因此可以二分一下. 不过这道题有点小坑... ------------------------------------------------- ...

  6. BZOJ 3282: Tree( LCT )

    LCT.. -------------------------------------------------------------------------------- #include<c ...

  7. BZOJ 2631: tree( LCT )

    LCT...略麻烦... -------------------------------------------------------------------------------- #inclu ...

  8. BZOJ 3282 Tree Link-Cut-Tree(LCT)

    题目大意: 给定N个点以及每一个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y ...

  9. BZOJ 2631: tree [LCT splay区间]

    2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 3854  Solved: 1292[Submit][Status][Discus ...

随机推荐

  1. java枚举类型转换为Struts2的select的数据

    枚举类:AppSortEnum.java public enum AppSortEnum { CORE(0, "核心应用"), ENJOYMENT(1, "娱乐应用&qu ...

  2. flex遭遇text-overflow:hidden,white-space:nowrap

    最近在项目中遇到使用flex的时候,在flex-item元素中使用text-overflow:hidden:white-space:nowrap:进行省略文字的操作. 发现flex-item失控了,长 ...

  3. CSC.exe(C#编译器命令行)

    不要在普通的命令行窗口中编译,请先打开C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Visual Studio 2010 ...

  4. leetcode NO.171 Excel表列序号 (python实现)

    来源 https://leetcode-cn.com/problems/excel-sheet-column-number/description/ 题目描述 给定一个Excel表格中的列名称,返回其 ...

  5. maven学习(十二)——maven聚合与继承实战

    聚合与继承实战 创建四个Maven项目,如下图所示:

  6. “取出数据表中第10条到第20条记录”的sql语句+selecttop用法

    1.首先,select top用法: 参考问题 select top n * from和select * from的区别 select * from table -- 取所有数据,返回无序集合 sel ...

  7. AngularJs 特性 之 MVC

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...

  8. [luoguP3332] [ZJOI2013]K大数查询(树套树)

    传送门 一开始想的是区间线段树套权值线段树,结果好像不能实现. 然后题解是权值线段树套区间线段树. 区间线段树上标记永久化就省去了pushdown的操作减少常数. 标记永久化的话..yy不出来就看代码 ...

  9. vuemock数据

    http://www.jianshu.com/p/ccd53488a61b dev.server.js 61 行 app.use('/mock',express.static('./mock'))

  10. source ~/.bashrc 什么意思

    source:使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录 https://www.cn ...