P2351 [SDOi2012]吊灯
2024-09-21 17:42:46
P2351 [SDOi2012]吊灯
题意:
一棵树,能否全部分成大小为x的联通块。
分析:
显然x是n的约数。然后对于一个约数x,判断能否分成 $ \frac{n}{x} $ 个大小为x的联通块。
结论:如果x可以,那么一定存在$ \frac{n}{x} $个节点的子树大小是x的倍数。
证明:上面的结论说明的也就是每个大小是x的倍数的点,对答案的贡献是1(每个点都可以分出一个大小为x的块),加起来就是$ \frac{n}{x} $。
现在就要考虑一个点u的siz是kx,然后它的子树里如果没有其他点的siz的是x的倍数的话,它的贡献是1,它可以从根节点开始,分出一个包含根节点,一共x个点的联通块。
然后考虑u的子树里还有一个点v的siz是x的倍数,那么如果它们还能分成两个大小为x的块的话,那么每个这样的点的贡献还是1。首先从在v的子树里一定可以从根开始分出一个大小为x的块(u在其中),然后u的子树里需要找一个大小为x的块,且不使用v中的点。假设去掉v中的点还剩siz[u]-siz[v]个,这也是x的倍数,所以u的子树里,从根开始,不占用v的点,还可以分出一个大小为x的块。说明u的子树可以贡献2,uv各自贡献1。
如果u的子树还有这样的点,那么把v删掉,还是两个点的情况,所以还是合法的。
到此发现每个大小为x的倍数的点,会对答案贡献1。$ \frac{n}{x} $$个,就会有$ \frac{n}{x} $个大小为x的联通块,如果小于则不行。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; int fa[N], cnt[N], siz[N], n;
vector<int> v; bool check(int x) {
int res = ;
for (int i=x; i<=n; i+=x) res += cnt[i];
return res >= n / x;
} int main() {
n = read();
for (int lim=sqrt(n),i=; i<=lim; ++i) {
if (n % i == ) {
v.push_back(i);
if (n / i != i) v.push_back(n / i);
}
}
sort(v.begin(), v.end());
for (int i=; i<=n; ++i)
fa[i] = read();
for (int T=; T<=; ++T) {
printf("Case #%d:\n",T);
for (int i=; i<=n; ++i) cnt[i] = , siz[i] = ;
for (int i=n; i>=; --i) siz[fa[i]] += siz[i], cnt[siz[i]] ++;
for (int i=; i<v.size(); ++i)
if (check(v[i])) printf("%d\n",v[i]);
if (T != ) for (int i=; i<=n; ++i)
fa[i] = (fa[i] + ) % (i - ) + ;
}
return ;
}
最新文章
- ecmall中static变量的使用-model模型代码设计
- oracle如何写包
- STM8 EEPROM:
- sqlmap小白操作
- Dynamics AX 2012 R3 Demo 安装与配置 - 安装数据服务器、AOS和客户端 (Step 2)
- sprint3(第六天)
- 遍历Map集合的方法
- PHPcms 摘要
- as3.0服务端FMS软件常用的方法与属性参考示例
- nutch 二次开发
- linux局域网不能相互访问
- Codeforces Round #258 (Div. 2/B)/Codeforces451B_Sort the Array
- Java之StringBuffer,StringBuilder,Math,Date,SimpleDateFormat,UUID,File
- 在CentOS7上通过RPM安装实现LAMP+phpMyAdmin过程全记录
- Java经典编程题50道之十五
- 洛谷U19464 山村游历(Wander)(LCT,Splay)
- qemu 系列
- BurpSuite 各模块使用
- Javascript内置对象、原生对象、宿主对象关系
- 51Nod 1007:正整数分组(01背包)
热门文章
- ThreadLocal介绍
- Java---页面之间传值跳转
- perl学习---控制:unless,until,next,redo,last
- UVa 1442 - Cave
- 为什么 window.location.search 为空?
- SVN工具使用总结
- 二. Python WebDriver环境搭建
- 关于JavaScript中省略元素对数组长度的影响
- 【luogu P2919 [USACO08NOV]守护农场Guarding the Farm】 题解
- hdu 1010(迷宫搜索,奇偶剪枝)