【BZOJ】【3004】吊灯
2024-09-21 18:42:37
思路题
要将整棵树分成大小相等的连通块,那么首先我们可以肯定的是每块大小x一定是n的约数,且恰好分成$\frac{n}{x}$块,所以我有了这样一个思路:向下深搜,如果一个节点的size=x,就把这个子树砍掉做成一个连通块,并更新父亲及祖先的size,这样递归地切,如果最后size[1]==0就表示所有的点都被切成了一个连通块……
然后我只得了40分= =明显会T啊……
事实上有一个更进一步的结论:上个做法中每次“砍”的点一定是size[i]%x==0的点!所以我们只需要判一下size[i]%x==0的点的数量是否等于$\frac{n}{x}$即可……
这个算法就可以顺利过掉所有数据了(复杂度O(NloglogN))
/**************************************************************
Problem: 3004
User: Tunix
Language: C++
Result: Accepted
Time:3888 ms
Memory:20024 kb
****************************************************************/ //Huce #3 C
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*sign;
}
typedef long long LL;
const int N=,INF=~0u>>;
/*******************tamplate********************/
int Case=,n,fa[N],sz[N],a[N],c[N];
bool jud(int x){
int cnt=;
for(int i=x;i<=n;i+=x) cnt+=c[i];
return cnt==n/x;
}
void solve(){
memset(sz,,sizeof sz);
memset(c,,sizeof c);
printf("Case #%d:\n",++Case);
D(i,n,){
sz[i]++;
sz[fa[i]]+=sz[i];
c[sz[i]]++;
}
F(i,,n) if (n%i==)
if (jud(i)) printf("%d\n",i);
}
void change(){
F(i,,n) fa[i]=(fa[i]+)%(i-)+;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
#endif
n=getint(); fa[]=;
F(i,,n) scanf("%d%*c",&fa[i]);
solve();
F(i,,){
change();
solve();
}
return ;
}
3004: 吊灯
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 24 Solved: 17
[Submit][Status][Discuss]
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
1,2,3,4,5
Sample Output
Case #: Case #: Case #: Case #: Case #: Case #: Case #: Case #: Case #: Case #:
HINT
对于100%的数据,n<=1.2*106。
Source
最新文章
- shell命令find
- 四、基于hadoop的nginx访问日志分析---top 10 request
- EASYUI+MVC4通用权限管理平台
- 关于<;img>;标签与文字垂直居中
- fragment第二次载入就报错
- hdu 1760 一道搜索博弈题 挺新颖的题目
- Terminating app due to uncaught exception &#39;NSUnknownKeyException&#39; this class is not key value coding-compliant for the key
- win10下面visual studio, sublime ctrl+shift+f快捷键失效的原因
- 学unity3d需要什么基础
- ueditor笔记
- DRF之版本控制、认证和权限组件
- kubernets controller 和 CRD 具体组件分析
- Luogu P3966 [TJOI2013]单词
- CSS表单3 光标样式 (每个位置鼠标放上去的样式不同)
- UVA 11488 Hyper Prefix Sets (字典树)
- Linq 增删改查
- MyBatis官方文档——XML 映射配置文件
- [原]外网访问用azure虚拟机搭建的网站
- 删除数组某一项,使用splice的坑
- AbstractQueuedSynchronizer原理分析