【BZOJ4401】块的计数

Description

小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树。听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效。当然,无聊的小Y对这种事情毫无兴趣,只是对把树分块这个操作感到十分好奇。他想,假如能把一棵树分成几块,使得每个块中的点数都相同该有多优美啊!小Y很想知道,能有几种分割方法使得一棵树变得优美。小Y每次会画出一棵树,但由于手速太快,有时候小Y画出来的树会异常地庞大,令小Y感到十分的苦恼。但是小Y实在是太想知道答案了,于是他找到了你,一个天才的程序员,来帮助他完成这件事。

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

题解:结论!如果ans是一个合法的块的大小,那么在n个点中子树大小是ans的倍数的节点数一定等于n/ans。

所以我们将每个节点的子树大小都扔到桶里,然后暴力枚举n的所有约数,暴力查询即可。时间复杂度?等于n的所有约数之和,是$O(nloglogn)$级别的。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5. const int maxn=1200010;
  6. int n,ans,cas;
  7. int siz[maxn],st[maxn],fa[maxn];
  8. inline char nc()
  9. {
  10. static char buf[100000],*p1=buf,*p2=buf;
  11. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  12. }
  13. inline int rd()
  14. {
  15. int ret=0,f=1; char gc=nc();
  16. while(!isdigit(gc)) {if(gc=='-') f=-f; gc=nc();}
  17. while(isdigit(gc)) ret=ret*10+(gc^'0'),gc=nc();
  18. return ret*f;
  19. }
  20. int main()
  21. {
  22. n=rd();
  23. register int i,j,sum;
  24. for(i=2;i<=n;i++) fa[i]=rd();
  25. for(cas=1;cas<=10;cas++)
  26. {
  27. printf("Case #%d:\n",cas);
  28. for(i=n;i>=1;i--) siz[fa[i]]+=(++siz[i]),st[siz[i]]++;
  29. for(i=1;i<=n;i++) if(n%i==0)
  30. {
  31. for(sum=0,j=i;j<=n;j+=i) sum+=st[j];
  32. if(sum==n/i) printf("%d\n",i);
  33. }
  34. if(cas<10)
  35. {
  36. memset(siz,0,sizeof(siz)),memset(st,0,sizeof(st));
  37. for(i=2;i<=n;i++) fa[i]=(fa[i]+19940105)%(i-1)+1;
  38. }
  39. }
  40. return 0;
  41. }
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. using namespace std;
  5. const int maxn=1000010;
  6. int n,cnt,ans;
  7. int to[maxn<<1],next[maxn<<1],head[maxn],siz[maxn],st[maxn];
  8. inline void add(int a,int b)
  9. {
  10. to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
  11. }
  12. void dfs(int x,int fa)
  13. {
  14. siz[x]=1;
  15. for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) dfs(to[i],x),siz[x]+=siz[to[i]];
  16. st[siz[x]]++;
  17. }
  18. inline int rd()
  19. {
  20. int ret=0,f=1; char gc=getchar();
  21. while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
  22. while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
  23. return ret*f;
  24. }
  25. int main()
  26. {
  27. n=rd();
  28. int i,j,sum,a,b;
  29. memset(head,-1,sizeof(head));
  30. for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
  31. dfs(1,0);
  32. for(i=1;i<=n;i++) if(n%i==0)
  33. {
  34. for(sum=0,j=i;j<=n;j+=i) sum+=st[j];
  35. if(sum==n/i) ans++;
  36. }
  37. printf("%d",ans);
  38. return 0;
  39. }

【BZOJ4401/3004】块的计数/吊灯 乱搞的更多相关文章

  1. 【bzoj4401】块的计数

    首先,块的大小确定的话,可以发现方案最多只有1种 然后就可以O(nsqrt(n))搞,不过会TLE 接着我们又发现,一个节点可以作一个块的根,当且仅当该节点的size能被块的大小整除 然后就可以O(n ...

  2. 【bzoj4401】块的计数 结论题

    题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...

  3. 【bzoj4401】块的计数(水dfs)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4401 假设把树划分为x个节点作一块,那么显然只有当x|n的时候才可能存在划分方案,并且这 ...

  4. BZOJ4401:块的计数(乱搞)

    Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...

  5. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】

    黑白图像直方图 发布时间: 2017年7月9日 18:30   最后更新: 2017年7月10日 21:08   时间限制: 1000ms   内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...

  6. BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞

    BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...

  7. 学渣乱搞系列之Tarjan模板合集

    学渣乱搞系列之Tarjan模板合集 by 狂徒归来 一.求强连通子图 #include <iostream> #include <cstdio> #include <cs ...

  8. URAL 1827 Indigenous Wars(排序、乱搞)

    题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...

  9. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

随机推荐

  1. LINQ操作符三:限制操作符

    where是限制操作符,它将过滤标准应用在序列上,按照提供的逻辑对序列中的数据进行过滤. where操作符不启动查询的执行.当开始对序列进行遍历时才开始执行,此时过滤条件将被应用到查询中. 示例: / ...

  2. DIV+CSS 命名规范

    常用的CSS命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar栏目:column 页面外围控制整体布局宽度:wrapper 左 ...

  3. 关于Cocos2d-x中监听物体不超越边界的解决方案

    写一个监听器 touchlistener->onTouchMoved = [this](Touch* pTouch, Event*) { auto delta = pTouch->getD ...

  4. matlab下使用svmlib工具包

    虽然网络上已经有了很多的类似的东西了吧.但是呢,我自己还是要写一写的. 安装: 对于 libsvm工具包,我们可以去官方网站下载,网址为:http://www.csie.ntu.edu.tw/~cjl ...

  5. (转)关于三星cortex A9 Sate4412 开发板 uboot 启动的一些问题释疑

    说明:本文转载自:http://blog.csdn.net/gooogleman/article/details/17238079  作者:gooogleman                   日 ...

  6. 【Java面试题】32 ArrayList和Vector的区别

    1. Vector & ArrayList  相同点: 1.ArrayList和Vector都是继承了相同的父类和实现了相同的接口 2.底层都是数组实现的 3.初始默认长度都为10. 不同点: ...

  7. J2SE基础:8.系统经常使用类二

    1:基础数据与封装类型之间的转型 A:基础数据类型--->封装类型(对象类型) Boolean boolean_1 = new Boolean(true); byte ---->Byte ...

  8. Asp.Net实现FORM认证的一些使用技巧(必看篇)

    最近因为项目代码重构需要重新整理用户登录和权限控制的部分,现有的代码大体是参照了.NET的FORM认证,并结合了PORTAL KITS的登录控制,代码比较啰嗦,可维护性比较差.于是有了以下的几个需求( ...

  9. JQuery上传插件Uploadify使用详解 asp.net版

    先来一个实例 Uploadify插件是JQuery的一个文件支持多文件上传的上传插件,ajax异步上传,实现的效果非常不错,带进度显示.不过官方提供的实例时php版本的,本文将详细介绍Uploadif ...

  10. HEVC有损优化二

    1 .  HEVC有很些设置对速度的提升有很大的帮助,比如m_bUseEarlyCU,m_useEarlySkipDetection等. 把它们设置成true,会有意想不到的效果. 比如对于不同分辨率 ...