【BZOJ4401/3004】块的计数/吊灯 乱搞
【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
1 2
2 3
2 4
4 5
5 6
Sample Output
题解:结论!如果ans是一个合法的块的大小,那么在n个点中子树大小是ans的倍数的节点数一定等于n/ans。
所以我们将每个节点的子树大小都扔到桶里,然后暴力枚举n的所有约数,暴力查询即可。时间复杂度?等于n的所有约数之和,是$O(nloglogn)$级别的。
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- using namespace std;
- const int maxn=1200010;
- int n,ans,cas;
- int siz[maxn],st[maxn],fa[maxn];
- inline char nc()
- {
- static char buf[100000],*p1=buf,*p2=buf;
- return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
- }
- inline int rd()
- {
- int ret=0,f=1; char gc=nc();
- while(!isdigit(gc)) {if(gc=='-') f=-f; gc=nc();}
- while(isdigit(gc)) ret=ret*10+(gc^'0'),gc=nc();
- return ret*f;
- }
- int main()
- {
- n=rd();
- register int i,j,sum;
- for(i=2;i<=n;i++) fa[i]=rd();
- for(cas=1;cas<=10;cas++)
- {
- printf("Case #%d:\n",cas);
- for(i=n;i>=1;i--) siz[fa[i]]+=(++siz[i]),st[siz[i]]++;
- for(i=1;i<=n;i++) if(n%i==0)
- {
- for(sum=0,j=i;j<=n;j+=i) sum+=st[j];
- if(sum==n/i) printf("%d\n",i);
- }
- if(cas<10)
- {
- memset(siz,0,sizeof(siz)),memset(st,0,sizeof(st));
- for(i=2;i<=n;i++) fa[i]=(fa[i]+19940105)%(i-1)+1;
- }
- }
- return 0;
- }
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- using namespace std;
- const int maxn=1000010;
- int n,cnt,ans;
- int to[maxn<<1],next[maxn<<1],head[maxn],siz[maxn],st[maxn];
- inline void add(int a,int b)
- {
- to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
- }
- void dfs(int x,int fa)
- {
- siz[x]=1;
- for(int i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) dfs(to[i],x),siz[x]+=siz[to[i]];
- st[siz[x]]++;
- }
- inline int rd()
- {
- int ret=0,f=1; char gc=getchar();
- while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
- while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
- return ret*f;
- }
- int main()
- {
- n=rd();
- int i,j,sum,a,b;
- memset(head,-1,sizeof(head));
- for(i=1;i<n;i++) a=rd(),b=rd(),add(a,b),add(b,a);
- dfs(1,0);
- for(i=1;i<=n;i++) if(n%i==0)
- {
- for(sum=0,j=i;j<=n;j+=i) sum+=st[j];
- if(sum==n/i) ans++;
- }
- printf("%d",ans);
- return 0;
- }
【BZOJ4401/3004】块的计数/吊灯 乱搞的更多相关文章
- 【bzoj4401】块的计数
首先,块的大小确定的话,可以发现方案最多只有1种 然后就可以O(nsqrt(n))搞,不过会TLE 接着我们又发现,一个节点可以作一个块的根,当且仅当该节点的size能被块的大小整除 然后就可以O(n ...
- 【bzoj4401】块的计数 结论题
题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...
- 【bzoj4401】块的计数(水dfs)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4401 假设把树划分为x个节点作一块,那么显然只有当x|n的时候才可能存在划分方案,并且这 ...
- BZOJ4401:块的计数(乱搞)
Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...
- “盛大游戏杯”第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 描述 在一个矩形的灰度图像上,每个 ...
- BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...
- 学渣乱搞系列之Tarjan模板合集
学渣乱搞系列之Tarjan模板合集 by 狂徒归来 一.求强连通子图 #include <iostream> #include <cstdio> #include <cs ...
- URAL 1827 Indigenous Wars(排序、乱搞)
题意:给一个长度为n数组{a[i]}.有m个操作Ti,Si,Li表示找以Ti值结束,以Si值开始,长度为Li的连续子串.找到后,将区间的答案值设为1.一开始答案值全部为0.最后输出n个答案值. 好久没 ...
- UVA 11853 [dfs乱搞]
/* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...
随机推荐
- LINQ操作符三:限制操作符
where是限制操作符,它将过滤标准应用在序列上,按照提供的逻辑对序列中的数据进行过滤. where操作符不启动查询的执行.当开始对序列进行遍历时才开始执行,此时过滤条件将被应用到查询中. 示例: / ...
- DIV+CSS 命名规范
常用的CSS命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar栏目:column 页面外围控制整体布局宽度:wrapper 左 ...
- 关于Cocos2d-x中监听物体不超越边界的解决方案
写一个监听器 touchlistener->onTouchMoved = [this](Touch* pTouch, Event*) { auto delta = pTouch->getD ...
- matlab下使用svmlib工具包
虽然网络上已经有了很多的类似的东西了吧.但是呢,我自己还是要写一写的. 安装: 对于 libsvm工具包,我们可以去官方网站下载,网址为:http://www.csie.ntu.edu.tw/~cjl ...
- (转)关于三星cortex A9 Sate4412 开发板 uboot 启动的一些问题释疑
说明:本文转载自:http://blog.csdn.net/gooogleman/article/details/17238079 作者:gooogleman 日 ...
- 【Java面试题】32 ArrayList和Vector的区别
1. Vector & ArrayList 相同点: 1.ArrayList和Vector都是继承了相同的父类和实现了相同的接口 2.底层都是数组实现的 3.初始默认长度都为10. 不同点: ...
- J2SE基础:8.系统经常使用类二
1:基础数据与封装类型之间的转型 A:基础数据类型--->封装类型(对象类型) Boolean boolean_1 = new Boolean(true); byte ---->Byte ...
- Asp.Net实现FORM认证的一些使用技巧(必看篇)
最近因为项目代码重构需要重新整理用户登录和权限控制的部分,现有的代码大体是参照了.NET的FORM认证,并结合了PORTAL KITS的登录控制,代码比较啰嗦,可维护性比较差.于是有了以下的几个需求( ...
- JQuery上传插件Uploadify使用详解 asp.net版
先来一个实例 Uploadify插件是JQuery的一个文件支持多文件上传的上传插件,ajax异步上传,实现的效果非常不错,带进度显示.不过官方提供的实例时php版本的,本文将详细介绍Uploadif ...
- HEVC有损优化二
1 . HEVC有很些设置对速度的提升有很大的帮助,比如m_bUseEarlyCU,m_useEarlySkipDetection等. 把它们设置成true,会有意想不到的效果. 比如对于不同分辨率 ...