[bzoj3004][SDOI2012]吊灯——樹形DP
Brief Description
給定一棵樹, 判斷是否可以將其分成\(\frac{n}{k}\)個聯通塊, 其中每個聯通塊的大小均爲k.
Algorithm Design
我們有一個結論: k可行iff存在\(\frac{n}{k}\)個點, 以這些點爲根的子樹大小爲k或k的倍數.
讀者可以自行yy一下證明.
有了這個結論之後, 我們可以算出每個size, 用一個桶統計一下就好了.
Code
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <cstring>
const int maxn = 1200000;
int fa[maxn], n, divide[maxn], size[maxn], f[maxn], tot = 0;
void fuck(int n) {
  int i;
  for (i = 1; i * i < n; i++) {
    if (n % i == 0) {
      divide[tot++] = i;
      divide[tot++] = n / i;
    }
  }
  if (i * i == n)
    divide[tot++] = i;
  std::sort(divide, divide + tot);
}
int main() {
  //  freopen("sdoi12_divide.in", "r", stdin);
  //  freopen("sdoi12_divide.out", "w", stdout);
  scanf("%d", &n);
  char ch = getchar();
  int cnt = 0;
  while (cnt < (n - 1)) {
    int x = 0;
    while (!isdigit(ch))
      ch = getchar();
    while (isdigit(ch)) {
      x = x * 10 + ch - '0';
      ch = getchar();
    }
    cnt++;
    fa[cnt + 1] = x;
  }
  fuck(n);
  for (int T = 1; T <= 10; T++) {
    printf("Case #%d:\n", T);
    memset(size, 0, sizeof(size));
    memset(f, 0, sizeof(f));
    for (int i = 2; i <= n; i++) {
      if (T != 1) {
        fa[i] = (fa[i] + 19940105) % (i - 1) + 1;
      }
    }
    for (int i = n; i; i--)
      size[fa[i]] += ++size[i];
    for (int i = 1; i <= n; i++)
      f[size[i]]++;
    for (int i = 0; i < tot; i++) {
      int tmp = 0;
      for (int j = divide[i]; j <= n; j += divide[i])
        tmp += f[j];
      if (tmp == n / divide[i]) {
        printf("%d\n", divide[i]);
      }
    }
  }
}
[bzoj3004][SDOI2012]吊灯——樹形DP的更多相关文章
- Contest 高数题 樹的點分治 樹形DP
		高数题 HJA最近在刷高数题,他遇到了这样一道高数题.这道高数题里面有一棵N个点的树,树上每个点有点权,每条边有颜色.一条路径的权值是这条路径上所有点的点权和,一条合法的路径需要满足该路径上任意相邻的 ... 
- BZOJ1017魔兽地图DotR 樹形DP
		@(BZOJ)[樹形DP, 三維DP] Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA ... 
- [bzoj3004] [SDOi2012]吊灯
		Description Alice家里有一盏很大的吊灯.所谓吊灯,就是由很多个灯泡组成.只有一个灯泡是挂在天花板上的,剩下的灯泡都是挂在其他的灯泡上的.也就是说,整个吊灯实际上类似于[b]一棵树[/b ... 
- sql: T-SQL 统计计算(父子關係,樹形,分級分類的統計)
		---sql: T-SQL 统计计算(父子關係,樹形,分級分類的統計) ---2014-08-26 塗聚文(Geovin Du) CREATE PROCEDURE proc_Select_BookKi ... 
- P2351 [SDOi2012]吊灯
		P2351 [SDOi2012]吊灯 https://www.luogu.org/problemnew/show/P2351 题意: 一棵树,能否全部分成大小为x的联通块. 分析: 显然x是n ... 
- 算法技巧讲解》关于对于递推形DP的前缀和优化
		这是在2016在长沙集训的第三天,一位学长讲解了“前缀和优化”这一技巧,并且他这一方法用的很6,个人觉得很有学习的必要. 这一技巧能使线性递推形DP的速度有着飞跃性的提升,从O(N2)优化到O(N)也 ... 
- C. The Fair Nut and String 递推分段形dp
		C. The Fair Nut and String 递推分段形dp 题意 给出一个字符串选择一个序列\({p_1,p_2...p_k}\)使得 对于任意一个\(p_i\) , \(s[p_i]==a ... 
- D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)
		Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ... 
- D. Serval and Rooted Tree (樹狀DP)
		Codeforce 1153D Serval and Rooted Tree (樹狀DP) 今天我們來看看CF1153D 題目連結 題目 給一棵數,假設有$k$個葉節點,我們可以給葉節點分配$1$~$ ... 
随机推荐
- Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正)
			Django 2.0官方文档中文 渣翻 总索引(个人学习,欢迎指正) 置顶 2017年12月08日 11:19:11 阅读数:20277 官方原文: https://docs.djangoprojec ... 
- 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃
			我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ... 
- Pc移植到Mac的技术细节
			1.样式不对: 2.布局不对: 3.Mac的菜单替换PC的菜单: Mac的菜单替换PC的菜单: 1)左上角图标没有手动添加且不需要添加的情况下出现,而且点击是Help菜单内容: 2)把HelpBtn和 ... 
- fiddler之弱网测试
			今天就说一下如何使用fiddler做弱网测试 1.首先要把手机的代理打开,这就不多讲了哈,不懂得话请点传送门:https://www.cnblogs.com/fuxinxin/p/9146693.ht ... 
- 第三十五篇 类的内置属性(attr属性),包装和授权,__getattr__
			双下划线开头的attr方法,都是类内置的方法. 一. 如果没有在类里定义这三个方法,调用的时候就调用类内置的默认的方法 class Too: pass # 类没有定义这三个属性,就用系统默认的方法 t ... 
- C指针分析详解
			局部变量和全局变量初始化区别: 局部变量,在未初始化情况下,初值为随机值.C规范对该初值并没有做规定,具体实现由编译器决定.如VC/VS等编译器,会将初始值值为0xCCCCCCCC, 而GCC等编译器 ... 
- c# 自动关机代码
			#region 关机代码 //C#关机代码 // 这个结构体将会传递给API.使用StructLayout //(...特性,确保其中的成员是按顺序排列的,C#编译器不会对其进行调整. [Struct ... 
- Vue2.0 新手完全填坑攻略——从环境搭建到发布(转载)
			强力推荐,详情请点击此链接http://www.jianshu.com/p/5ba253651c3b 
- 延迟加载(Lazyload)三种实现方式
			定义:延迟加载也称为惰性加载,即在长网页中延迟加载图像.用户滚动到它们之前,视口外的图像不会加载.这与图像预加载相反,在长网页上使用延迟加载将使网页加载更快.在某些情况下,它还可以帮助减少服务器负载. ... 
- [剑指Offer] 34.第一个只出现一次的数
			题目描述 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置 [思路]当一个字符第一次出现的位置和它最后一次出现的位置相同,那么 ... 
