Bzoj3004 吊灯

Time Limit: 10 Sec  Memory Limit: 128 MB

Submit: 72  Solved: 46

Description

Alice家里有一盏很大的吊灯。所谓吊灯,就是由很多个灯泡组成。只有一个灯泡是挂在天花板上的,剩下的灯泡都是挂在其他的灯泡上的。也就是说,整个吊灯实际上类似于一棵树。其中编号为1的灯泡是挂在天花板上的,剩下的灯泡都是挂在编号小于自己的灯泡上的。

现在,Alice想要办一场派对,她想改造一下这盏吊灯,将灯泡换成不同的颜色。她希望相同颜色的灯泡都是相连的,并且每一种颜色的灯泡个数都是相同的。

Alice希望你能告诉她,总共有哪些方案呢?

Alice是一个贪心的孩子,如果她发现方案不够多,或者太多了,就会很不高兴,于是她会尝试调整。对于编号为x(x≠1)的灯泡,如果原来是挂在编号为f[x]的灯泡上,那么Alice会把第x个灯泡挂到第 ( f[x] + 19940105 ) mod (x-1) + 1 个灯泡上。

由于九在古汉语中表示极大的数,于是,Alice决定只调整9次。对于原始状态和每一次调整过的状态,Alice希望你依次告诉她每种状态下有哪些方案。

Input

第一行一个整数n,表示灯泡的数量。

接下来一行,有n-1个整数Ui,第i个数字表示第i+1个灯泡挂在了Ui个的下面。保证编号为1的灯泡是挂在天花板上的。数字之间用逗号‘,’隔开且最后一个数字后面没有逗号。

Output

对于10种状态下的方案,需要按照顺序依次输出。

对于每一种状态,需要先输出单独的一行,表示状态编号,如样例所示。

之后若干行,每行1个整数,表示划分方案中每种颜色的灯泡个数。

按升序输出。

Sample Input

6
1,2,3,4,5

Sample Output

Case #1:
1
2
3
6
Case #2:
1
2
6
Case #3:
1
3
6
Case #4:
1
3
6
Case #5:
1
3
6
Case #6:
1
2
6
Case #7:
1
2
3
6
Case #8:
1
6
Case #9:
1
2
6
Case #10:
1
3
6

HINT

对于100%的数据,n<=1.2*106。

Source

脑洞题。

看到数据范围,内心惴惴不安。再看时间限制10s,嗨呀,随便写嘛!

树的重建是需要暴力维护的,不可避。

重建树后,统计每个结点的子树的结点总数。如果每种颜色的灯泡有k个,那么必须满足n%k==0,且结点数等于k的倍数的子树有n/k个。

统计树size的时候,建边DFS太浪费时间,由于每个结点的父亲编号必定小于自身,可以从编号n到编号1依次上传更新size。

 1 /*by SilverN*/
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int mxn=1200010;
 9 int read(){
10     int x=0,f=1;char ch=getchar();
11     while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
12     while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
13     return x*f;
14 }
15 int n;
16 int a[mxn],cnt=0;
17 int fa[mxn],num[mxn];
18 int c[mxn];
19 //void DFS(int u,int fa){
20 //}
21 void reset(){
22     for(int i=2;i<=n;i++){
23         fa[i]=(fa[i]+19940105)%(i-1)+1;
24     }
25     return;
26 }
27 void init1(){
28     int m=sqrt(n);
29     for(int i=1;i<=m;i++){
30         if(n%i==0){
31             a[++cnt]=i;
32             if(i*i!=n)a[++cnt]=n/i;
33         }
34     }
35     return;
36 }
37 void init(){
38     memset(c,0,sizeof c);
39     for(int i=1;i<=n;i++)num[i]=1;
40     return;
41 }
42 void solve(){
43     init();
44     int i,j;
45     for(i=n;i>=1;i--)
46         num[fa[i]]+=num[i];
47     for(i=1;i<=n;i++)c[num[i]]++;
48     for(i=1;i<=cnt;i++){
49         int x=a[i];//每种颜色x个灯泡
50         int res=0;
51         for(j=x;j<=n;j+=x){
52             res+=c[j];
53         }
54         if(n/x==res)printf("%d\n",x);
55     }
56     return;
57 }
58 int main(){
59     n=read();
60     init1();
61     int i,j;
62     for(i=2;i<=n;i++)fa[i]=read();
63     printf("Case #1:\n");
64     solve();
65     for(i=1;i<=9;i++){
66         printf("Case #%d:\n",i+1);
67         reset();
68         solve();
69     }
70     return 0;
71 }
时间: 2024-08-07 16:39:24

Bzoj3004 吊灯的相关文章

[bzoj3004] [SDOi2012]吊灯

Description Alice家里有一盏很大的吊灯.所谓吊灯,就是由很多个灯泡组成.只有一个灯泡是挂在天花板上的,剩下的灯泡都是挂在其他的灯泡上的.也就是说,整个吊灯实际上类似于[b]一棵树[/b].其中编号为 1 的灯泡是挂在天花板上的,剩下的灯泡都是挂在编号小于自己的灯泡上的. 现在,Alice想要办一场派对,她想改造一下这盏吊灯,将灯泡换成不同的颜色.她希望相同颜色的灯泡都是相连的,并且每一种颜色的灯泡个数都是相同的. Alice希望你能告诉她,总共有哪些方案呢? Alice是一个贪心

codevs1521 华丽的吊灯

1521 华丽的吊灯 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 著名的Microhardware公司即将迎来其创业50周年庆典,为了使这次庆典能够体面而又隆重,以显出公司在国际硬件的龙头地位,总裁决定举办一次交谊舞会,届时将有社会各界名流前来捧场,希望以此来提高本公司的名望.他将布置场地的任务交给了JYY,而JYY遇到了一个小小的问题--吊灯.    在当前的经济环境下,JYY为了省钱,从一个不知名的小吊灯商那里购来一

【BZOJ】【3004】吊灯

思路题 要将整棵树分成大小相等的连通块,那么首先我们可以肯定的是每块大小x一定是n的约数,且恰好分成$\frac{n}{x}$块,所以我有了这样一个思路:向下深搜,如果一个节点的size=x,就把这个子树砍掉做成一个连通块,并更新父亲及祖先的size,这样递归地切,如果最后size[1]==0就表示所有的点都被切成了一个连通块…… 然后我只得了40分= =明显会T啊…… 事实上有一个更进一步的结论:上个做法中每次“砍”的点一定是size[i]%x==0的点!所以我们只需要判一下size[i]%x

BZOJ 3004 吊灯 树形DP

题目大意:给定一棵树,要求将这棵树分成nk个连通块,每块大小为k,求所有可行的k 首先k一定是n的约数.(废话 然后我们有一个结论:某个k满足条件当且仅当存在nk个节点满足以每个节点为根的子树大小都是k的倍数 证明: 首先不可能存在超过nk个节点满足以每个节点为根的子树大小都是k的倍数,这是废话 首先证明必要性: 假设我们已经有了一组合法的方案,那么对于每一个连通块,我们找到这个连通块中深度最小的节点,以这个节点为根的子树大小一定是k的倍数 由于这样的节点有nk个,因此必要性得证 下面来证明充分

[SDOi2012]吊灯

嘟嘟嘟 这题想了半天,搞出了一个\(O(10 * d * n)\)(\(d\)为\(n\)的约数个数)的贪心算法,就是能在子树内匹配就在子树内匹配,否则把没匹配的都交给父亲,看父亲能否匹配.交上去开了O2才得了60分.按讨论中的方法卡常后还是A不了,就放弃了. 正解需要推一个结论,就是一棵树能被分成\(x\)个大小相同的联通块,必须满足至少有\(\frac{n}{x}\)个子树的大小为\(x\)的倍数. 证明啥的yy一下就好啦-- 想到这个结论后,我还是没想出复杂度更优的算法--最后看题解才知道

使用three.js创建3D机房模型-分享一

序:前段时间公司一次研讨会上,一市场部同事展现了同行业其他公司的3D机房,我司领导觉得这个可以研究研究,为了节约成本,我们在网上大量检索,最后找到一位前辈的博文[TWaver的技术博客],在那篇博文的评论区终于找到了那位前辈的源码,可惜下载后发现是压缩过的.min.js文件.经过各种研究发现,那是人家公司自己卖钱的库,不能完全共享,所以我司决定,派本人研究一下web3D的技术,于是乎便有了下面的技术分享. 一.本着开源的思想,使用three.js框架,封装常用的模型库.先学着那位前辈的样子,使用

spring源码深度解析-1核心实现

佟濒嬖 输榨 垤阈霎俎 瘁怛午瓷 翱&距跺 思疽愠 位儿属 缓洵ニ糜 柜调渤黟 象兕盅刿 俘¢筋芹 饭幌︸槛 娜商愫生 戕铁呤鲚 拉茴胬堍 抚┲耵科 ╄谜砼鼷 唿滋择唰 办公室内拉着窗帘天花板上的吊灯散着柔和的光芒陈琳斜 驵词辈钭 澶I谡 偃湖邾▲ 蓰靳╂Д 菟洫酽鳏 郇哟憷缏 都升不了花了近三个小时的时间终 卑跑谆牌 H刀 肽熨幻岛 僻苛乙思 牵恳性 夥驱ず 洪淡 怂屐速 拼③鄯审 虱蠊耋腮 荀杈κ 厅莉彩 起启滕 壶姗讲铋 蔷檫 庇频踉啕 但不理她径自下楼到

20145234《信息安全系统设计基础》课程总结

1.每周作业链接汇总 第零周作业:http://www.cnblogs.com/taigenzhenjun/p/5863056.html Linux系统安装 第一周作业:http://www.cnblogs.com/taigenzhenjun/p/5881117.html Linux核心命令 第二周作业:http://www.cnblogs.com/taigenzhenjun/p/5907272.html Vi的基本操作 第三周作业:http://www.cnblogs.com/taigenzh

2016软装设计师不可不知的几个软装技巧

在外人看来软装设计师是一个光鲜亮丽的职业,但其实只有自己经历了这个职业,才能体会其所要付出的汗水.当然,作为一名软装设计师,也是幸运和幸福的,因为我们都生活在自己的梦里,为每一个家庭打造属于他们的梦幻城堡,如此一想,也是很快乐的一件事.如果说<盗梦空间>让我们震撼于造梦的绚丽.美妙:那么软装设计师则是见证美丽奇迹的天使.以下五色光软装设计培训机构小编为大家整理了一些想要成为一名顶尖软装设计师所必知的几个软装技巧,希望能帮助到大家. 软装饰即在完成地板.墙面.门窗等硬装后进行可移动的.材质上也较