题意

\(n(1 \le 1000000)\)个点的有根树,\(1\)号点为根,\(q(1 \le 1000000)\)次询问,每次给一个\(k\),每一次可以选择\(k\)个未访问的点,且父亲是访问过的,要求最少次数访问完所有的点。

分析

神题不会做。

题解

得到一个式子\(ans=max(i+ \left \lceil \frac{s[i]}{k} \right \rceil), 0 \le i \le maxh\),其中\(maxh\)是最大深度,\(s[i]\)是深度大于\(i\)的点的数量。证明如下:

定义关键层\(i\)表示拿了\(i\)次后、前\(i\)层已经拿完,以后每一次都可以拿\(k\)个(最后一次除外)。我们需要证明:1、存在关键层。2、关键层的解是最小解。

首先我们按照下面两个规则查询:

  1. 如果当前层\(i\)的结点不够\(k\),则查询完,而且如果之前有\(j < i\)层的点没查询,则查询完。
  2. 如果足够了\(k\),则在保证最终能在第\(maxh\)次遍历到第\(maxh\)层的情况下,随便选\(k\)个。

那么显然在最后一个执行1操作而且那层\(i\)不存在\(j < i\)层的点没查询的\(i\)就是关键层。由于这样的1操作至少有一个(即第1层肯定是执行的是这样的1操作),所以关键层肯定存在,而且只有一个。

至于关键层的解是否是最小解,感觉很显然,然而不会严格证明。

至于取max,不会严格证明。

最后原题可以转化为\(ans=\left \lceil max(i+\frac{s[i]}{k}) \right \rceil\),所以按照\(i+\frac{s[i]}{k}\)来斜率优化就行辣。

#include <bits/stdc++.h>
using namespace std;
inline int getint() {
int x=0;
char c=getchar();
for(; c<'0'||c>'9'; c=getchar());
for(; c>='0'&&c<='9'; x=x*10+c-'0', c=getchar());
return x;
}
typedef long long ll;
const int N=1000005;
int a[N], d[N], q[N], c[N], ihead[N], cnt;
struct E {
int next, to;
}e[N];
void add(int x, int y) {
e[++cnt]=(E){ihead[x], y}; ihead[x]=cnt;
}
void dfs(int x) {
for(int i=ihead[x]; i; i=e[i].next) {
d[e[i].to]=d[x]+1;
dfs(e[i].to);
}
}
inline bool ok1(int i, int j, int k) {
return (ll)(c[j]-c[i])*(k-i)>(ll)(c[k]-c[i])*(j-i);
}
inline bool ok2(int b, int j, int k) {
return (ll)b*(j-k)>c[k]-c[j];
}
int main() {
int n=getint(), Q=getint();
for(int i=0; i<Q; ++i) {
a[i]=getint();
}
d[0]=1;
int mx=1;
for(int i=1; i<n; ++i) {
add(getint()-1, i);
}
dfs(0);
for(int i=0; i<n; ++i) {
++c[d[i]-1];
mx=max(mx, d[i]);
}
for(int i=mx; i; --i) {
c[i]+=c[i+1];
}
int *fr=q+1, *ta=q;
for(int i=1; i<=mx; ++i) {
for(; fr<ta && ok1(*(ta-1), i, *ta); --ta);
*++ta=i;
}
for(int i=1; i<=n; ++i) {
for(; fr<ta && ok2(i, *(fr+1), *fr); ++fr);
d[i]=*fr+(c[*fr]+i-1)/i;
}
for(int i=0; i<Q; ++i) {
printf("%d%c", a[i]>n?mx:d[a[i]], " \n"[i==Q-1]);
}
return 0;
}

【BZOJ】3835: [Poi2014]Supercomputer的更多相关文章

  1. 【BZOJ】3524: [Poi2014]Couriers

    [算法]主席树 [题解]例题,记录和,数字出现超过一半就递归查找. 主席树见[算法]数据结构 #include<cstdio> #include<algorithm> #inc ...

  2. 【BZOJ】3832: [Poi2014]Rally

    题意 \(n(2 \le n \le 500000)\)个点\(m(1 \le m \le 1000000)\)条边的有向无环图,找到一个点,使得删掉这个点后剩余图中的最长路径最短. 分析 神题不会做 ...

  3. 【BZOJ】3526: [Poi2014]Card

    题意 \(n(n \le 200000)\)张卡片,正反有两个数\(a[i], b[i]\).\(m(m \le 1000000)\)次操作,每次交换\(c[i].d[i]\)位置上的卡片.每一次操作 ...

  4. 【BZOJ】3523: [Poi2014]Bricks

    题意 \(n(n \le 1000000)\)个物品,颜色分别为\(a[i]\),现在要求排在一排使得相邻两个砖块的颜色不同,且限定第一个砖块和最后一个砖块的颜色,输出一个合法解否则输出-1. 分析 ...

  5. 【BZOJ】3521: [Poi2014]Salad Bar

    题意 长度为\(n(1 \le n \le 1000000)\)的\(01\)字符串.找一个最长的连续子串\(S\),使得不管是从左往右还是从右往左取,都保证每时每刻已取出的\(1\)的个数不小于\( ...

  6. 【BZOJ】3834: [Poi2014]Solar Panels

    http://www.lydsy.com/JudgeOnline/problem.php?id=3834 题意:求$max\{(i,j)\}, smin<=i<=smax, wmin< ...

  7. 【BZOJ】3524 [POI2014] Couriers(主席树)

    题目 传送门:QWQ 传送到洛谷QWQ 分析 把求区间第k大的改一改就ok了. 代码 #include <bits/stdc++.h> using namespace std; ; ], ...

  8. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  9. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

随机推荐

  1. RESTEasy-Rest服务框架

    什么是 RESTEasy RESTEasy 是 JBoss 的一个开源项目,提供各种框架帮助你构建 RESTful Web Services 和 RESTful Java 应用程序.它是 JAX-RS ...

  2. Rabbitmq Exchange Type 说明

    Exchange在定义的时候是有类型的,以决定到底是哪些Queue符合条件,可以接收消息 fanout 所有bind到此exchange的queue都可以接收消息 direct 通过routingKe ...

  3. codevs2645 Spore

    题目描述 Description 某陈和某Y 最近对一个游戏着迷.那是Electronic Arts 今年发布的优秀的模拟经营类游戏,Spore. 在Spore 中,玩家将经历从单细胞生物到星系的统治 ...

  4. jquery1.9以上版本如何使用toggle函数

    toggle() 方法用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件. 但是在1.9及以上的版本中已经删除了该功能. 感觉这个功能还是不错的,以下来自网上搜集,可以在js中 ...

  5. 解决Xftp经常断开连接的问题,Xftp中文乱码

    #文件 --> 选项 --> 勾选“发送保持活动状态消息” 间隔 60秒 #工具 -> 选项 延伸阅读: Xshell个性化设置,解决Xshell遇到中文显示乱码的问题

  6. Linux/CentOS下开启MySQL远程连接,远程管理数据库

    当服务器没有运行PHP.没装phpMyAdmin的时候,远程管理MySQL就显得有必要了. 第一步:开启MySQL用户的远程访问权限 mysql -u root -p mysql # 第1个mysql ...

  7. 利用边框border的属性做小符号

    前两天学习中,发现网站上的一个小符号,以为是插入的img,但找来找去也未发现img的地址.最后问了同学,才得知是用border属性做出来的. 符号如右:  其css代码如下: .fuhao { pos ...

  8. 深入理解使用ListView时ArrayAdapter、SimpleAdapter、BaseAdapter的原理

    在使用ListView的时候,我们传给setAdapter方法的Adapter通常是ArrayAdapter.SimpleAdapter.BaseAdapter,但是这几个Adapter内部究竟是什么 ...

  9. Windows中explorer(图形壳)

    explorer是Windows程序管理器或者文件资源管理器. 用于管理Windows图形壳.(桌面和文件管理.) 删除该程序会导致Windows图形界面无法使用. explorer.exe进程是微软 ...

  10. Redis Sentinel 高可用实现说明

    背景:      前面介绍了Redis 复制.Sentinel的搭建和原理说明,通过这篇文章大致能了解Sentinel的原理和实现方法以及相关的搭建.这篇文章就针对Redis Sentinel的搭建做 ...