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. luogu2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

    ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  2. CSU-1980 不堪重负的树

    CSU-1980 不堪重负的树 Description 小X非常喜欢树,然后他生成了一个大森林给自己玩. 玩着玩着,小X陷入了沉思. 一棵树由N个节点组成,编号为i的节点有一个价值Wi. 假设从树根出 ...

  3. Codeforces 1062E 题解

    给出一棵有根树,1为根结点,接下来q次询问,每次给出一个[l,r]区间,现在允许删掉[l,r]区间内任何一个点,使得所有点的最近公共祖先的深度尽可能大,问删掉的点是哪个点,深度最大是多少. 做法: 线 ...

  4. Leetcode 558.四叉树交集

    四叉树交集 四叉树是一种树数据,其中每个结点恰好有四个子结点:topLeft.topRight.bottomLeft 和 bottomRight.四叉树通常被用来划分一个二维空间,递归地将其细分为四个 ...

  5. 在同一个sql语句中如何写不同条件的count数量 (转)

    end) end)"描述名称2" from 表名 t

  6. docker端口的映射顺序

    sudo docker run -d -p 8080:80 --name static_web jamtur01/static_web nginx -g "dameon off;" ...

  7. HDU 4180 扩展欧几里得

    RealPhobia Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. 管理nuget程序包中搜索不到任何程序包

    之前一直使用vs2012开发,管理nuget程序包没有出现过什么问题.因为开发需要,需要使用vs2015,安装vs2015后再使用vs2012时,发现管理nuget程序包中搜索不到任何资源,晕死. 想 ...

  9. C#中找不到MouseWheel事件的解决办法

    在.....Designer.cs中加入 this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this. ...

  10. mapserver+QGIS+openlayers的安装和配置

    1.下载MS4W,不要怀疑MS4W就是mapserver,只是里面集成了一些其他的工具和库,下载地址:http://www.maptools.org/ms4w/index.phtml?page=dow ...