嘟嘟嘟




这题想了半天,搞出了一个\(O(10 * d * n)\)(\(d\)为\(n\)的约数个数)的贪心算法,就是能在子树内匹配就在子树内匹配,否则把没匹配的都交给父亲,看父亲能否匹配。交上去开了O2才得了60分。按讨论中的方法卡常后还是A不了,就放弃了。




正解需要推一个结论,就是一棵树能被分成\(x\)个大小相同的联通块,必须满足至少有\(\frac{n}{x}\)个子树的大小为\(x\)的倍数。

证明啥的yy一下就好啦……

想到这个结论后,我还是没想出复杂度更优的算法……最后看题解才知道,你开个桶记录子树大小,每次枚举倍数就能把\(n\)降成\(\sqrt{n}\)了……




啊忘说了,讨论中的卡常就是根据题中树的构造方法,把dfs改成逆序扫一遍,减小常数。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define enter puts("")
#define space putchar(' ')
#define Mem(a, x) memset(a, x, sizeof(a))
#define In inline
typedef long long ll;
typedef double db;
const int INF = 0x3f3f3f3f;
const db eps = 1e-8;
const int maxn = 1.2e6 + 5;
const int NUM = 19940105;
inline ll read()
{
ll ans = 0;
char ch = getchar(), last = ' ';
while(!isdigit(ch)) last = ch, ch = getchar();
while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
if(last == '-') ans = -ans;
return ans;
}
inline void write(ll x)
{
if(x < 0) x = -x, putchar('-');
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int n, fa[maxn];
struct Edge
{
int nxt, to;
}e[maxn];
int head[maxn], ecnt = -1;
In void addEdge(int x, int y)
{
e[++ecnt] = (Edge){head[x], y};
head[x] = ecnt;
} int num[maxn], cnt = 0;
In void init(int n)
{
for(int i = 1; i * i <= n; ++i)
if(n % i == 0)
{
num[++cnt] = i;
if(i * i < n) num[++cnt] = n / i;
}
sort(num + 1, num + cnt + 1);
} int ans;
int dp[maxn];
In bool dfs(int now, int _f) //我的O(n)贪心
{
for(int i = 1; i <= n; ++i) dp[i] = 1;
for(int i = n; i; --i)
{
if(dp[i] > ans) return 0;
if(dp[i] == ans) dp[i] = 0;
dp[fa[i]] += dp[i];
}
return 1;
} int siz[maxn], tot[maxn];
In bool judge(int x)
{
int ret = 0;
for(int i = x; i <= n; i += x) ret += tot[i];
return ret >= n / x;
}
In void solve()
{
fill(siz + 1, siz + n + 1, 1);
fill(tot + 1, tot + n + 1, 0);
for(int i = n; i; --i)
{
siz[fa[i]] += siz[i];
++tot[siz[i]];
}
for(int i = 1; i <= cnt; ++i)
{
ans = num[i];
if(judge(num[i])) write(ans), enter;
}
} int main()
{
n = read(); init(n);
for(int i = 2; i <= n; ++i) fa[i] = read();
puts("Case #1:");
solve();
for(int t = 1; t <= 9; ++t)
{
printf("Case #%d:\n", t + 1);
for(int i = 2; i <= n; ++i) fa[i] = (fa[i] + NUM) % (i - 1) + 1;
solve();
}
return 0;
}

[SDOi2012]吊灯的更多相关文章

  1. P2351 [SDOi2012]吊灯

    P2351 [SDOi2012]吊灯 https://www.luogu.org/problemnew/show/P2351     题意: 一棵树,能否全部分成大小为x的联通块. 分析: 显然x是n ...

  2. [bzoj3004] [SDOi2012]吊灯

    Description Alice家里有一盏很大的吊灯.所谓吊灯,就是由很多个灯泡组成.只有一个灯泡是挂在天花板上的,剩下的灯泡都是挂在其他的灯泡上的.也就是说,整个吊灯实际上类似于[b]一棵树[/b ...

  3. 洛谷P2351 [SDOi2012]吊灯 【数学】

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

  4. BZOJ.3004.[SDOI2012]吊灯(结论)

    题目链接 BZOJ 洛谷 题意: 将树划分为k个连通块,要求每个连通块大小相同.输出可能的大小. 结论: 满足条件时颜色的连通块数为k,当且仅当有 \(n/k\) 个节点满足它的子树是k的倍数(显然还 ...

  5. [bzoj3004][SDOI2012]吊灯——樹形DP

    Brief Description 給定一棵樹, 判斷是否可以將其分成\(\frac{n}{k}\)個聯通塊, 其中每個聯通塊的大小均爲k. Algorithm Design 我們有一個結論: k可行 ...

  6. BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2553  Solved: 1565[Submit][ ...

  7. BZOJ 2705: [SDOI2012]Longge的问题

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2554  Solved: 1566[Submit][ ...

  8. Bzoj3004 吊灯

    Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 72  Solved: 46 Description        Alice家里有一盏很大的吊灯.所 ...

  9. 【BZOJ】【3004】吊灯

    思路题 要将整棵树分成大小相等的连通块,那么首先我们可以肯定的是每块大小x一定是n的约数,且恰好分成$\frac{n}{x}$块,所以我有了这样一个思路:向下深搜,如果一个节点的size=x,就把这个 ...

随机推荐

  1. 面试官:你分析过SpringMVC的源码吗?

    1. MVC使用 在研究源码之前,先来回顾以下springmvc 是如何配置的,这将能使我们更容易理解源码. 1.1 web.xml <servlet> <servlet-name& ...

  2. 表单时间和定时器this的指向

    1.针对表单的 form 表单  input 输入框 select 下拉列表  textarea 文本域 type 类型 radio 单选框 checkbox 多选框 password 密码框 but ...

  3. Android Lifecycle使用

    引言 Lifecycle 是官方提供的架构组件之一,目前已经是稳定版本,Lifecycle 组件包括LifecycleOwner.LifecycleObserver.Lifecycle 组件是执行操作 ...

  4. K8S RBAC

    API Server 内部通过用户认证后,然后进入授权流程.对合法用户进行授权并且随后在用户访问时进行鉴权,是权限管理的重要环节. 在 kubernetes 集群中,各种操作权限是赋予角色(Role ...

  5. CSS效果:CSS改变下拉列表select框的默认样式

    原理 原理是将浏览器默认的下拉框样式清除,然后应用上自己的,再附一张向右对齐小箭头的图片即可.当然右侧的小箭头可以用伪元素before或者after来实现. select { /*Chrome和Fir ...

  6. BZOJ1299: [LLH邀请赛]巧克力棒(Nim游戏)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 552  Solved: 331[Submit][Status][Discuss] Descriptio ...

  7. python语言学习---3

    第四天 1.set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的, 这点和 dict 的 key很像. (不信可以输出下试试 ~-~ )另外,其存储的对象必须不可变 ...

  8. 淘宝开放平台使用WebClient,WebRequest访问时的错误提示导致麻烦

    淘宝开放平台(TOP)提供OAuth2.0支持 通过C#的WebClient/WebRequest直接访问时会提示grant type is empty,这是一个非常恼人的错误,你会发现即使传了这个参 ...

  9. Linux没有最小只有更小----迷你Linux版本大集合(转)

    [自从去年到现在已经收集了上百种版本的Linux和Unix,至于Unix就不想说了,没有Linux的功底是很难驾驭Unix的,我在这里只把小于360M的Linux以及一些非Linux但是很像Linux ...

  10. IIS ip访问限制插件

    Dynamic IP Restrictions Overview The Dynamic IP Restrictions Extension for IIS provides IT Professio ...