P3571 [POI2014] SUP-Supercomputer 题解
P3571「POI2014」SUP-Supercomputer 题解
一道 “较” 水的黑题 (可一开始苦思冥想还是不会)。
本蒟蒻的第一篇黑题题解,求赞。
题意简化
给定一棵 \(n\) 个节点、根节点为 \(1\) 的有根树。\(q\) 次询问中每次给定一个 \(k\),输出需要最少用几次操作次数 删除 完整棵树。每次操作可以选择 删除 不超过 \(k\) 个未访问的点,且这些点 没有父亲。(血腥的味道)
前置知识
有一个 小小 的结论:存在一个 \(i\),满足可以用 \(i\) 次操作删掉所有深度小于等于 \(i\) 的点,剩下的操作每次都删掉 \(k\) 个点。
形式化地,设 \(f_k\) 为 \(k\) 对应的答案,\(s_i\) 是深度大于 \(i\) 的点数,有:
\]
- Why?
显然 ,要证明 \(f_k=\max_i \lceil\frac{s_i}{k}\rceil+i\),转换为不等式,可分别证明 \(f_k\ge\max_i \lceil\frac{s_i}{k}\rceil+i\) 和 \(f_k\le\max_i \lceil\frac{s_i}{k}\rceil+i\):
证明 \(f_k\ge\max_i \lceil\frac{s_i}{k}\rceil+i\) :
可以注意到一个性质,要删除至少一个深度为 \(i\) 的点,至少需要 \(i\) 次操作。那么有 \(f_k\ge \max_i \lceil\frac{s_i}{k}\rceil+i\)。证明 \(f_k\le\max_i \lceil\frac{s_i}{k}\rceil+i\) :
设 \(f_{k,i}=i+\lceil\frac{s_i}{k}\rceil\),\(f_{k,i}\) 在 \(i=a\) 时取最大值。我们假设 \(b\) 步可以删除完前 \(b\) 层的节点,且这是满足条件的最大的 \(b\),即证 \(a=b\)。先证 \(a\ge b\):对于 \(c<b\),若 \(f_{k,c}>f_{k,b}\),则深度范围在 \((c,b]\) 之间的点数大于 \(k(b−c)\),删掉一个第 \(c\) 层的点至少要 \(c\) 步,删掉 \(c+1\) 到 \(b\) 层的所有点要大于 \((b−c)\) 步,那么前 \(b\) 层肯定 \(b\) 次删不完,矛盾。因此 \(a\ge b\)。
再证 \(a\le b\):
- 第 \(b+1\) 层一定有超过 \(k\) 个节点,\(f_{k,b+1}\le f_{k,b}\)。
- 若第 \(b+1\),\(b+2\) 层点数之和不超过 \(2k\),那么第 \(b+2\) 层的点数一定不足 \(b+1\) 层的,我们可以 \(b+2\) 次删除完前 \(b+2\) 层,矛盾,因此第 \(b+1\),\(b+2\) 层点数之和大于 \(2k\),\(f_{k,b+2}\le f_{k,b}\)。
以此类推 \(a\le b\)。
所以 \(a=b\),即 \(f_k\le\max_i \lceil\frac{s_i}{k}\rceil+i\)。
根据上面对 \(a\le b\) 的证明,可以归纳证明第 \(b+1\) 到第 \(b+t\) 层的点数之和大于 \(kt\),于是我们只需要一层一层删掉,并优先删除有儿子的结点就一定可行。这样 \(f_k=\max_i \lceil\frac{s_i}{k}\rceil+i\),证毕。
题目解法
嘿嘿,大脑有没有烧了呢?有了以上结论,这道题就可以 秒 切了。
对 \(f_k=\max_i \lceil\frac{s_i}{k}\rceil+i\) 进行变形:
\]
所以,只需求 \(g_k=\max s_i+ki\) 。
则:\(s_i=-ki+g_k\)(\(y=kx+b\))。
斜率优化即可,横坐标和斜率都单调,复杂度 \(\mathcal{O}(n)\)。
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,q[N],dep[N];
int sum[N],maxn,ans[N];
struct __{
int x,y;
bool operator<(const __ x)const{
return y<x.y;
}
}a[N];
double slp(int x,int y){
if(x==y)return 1e9;
return (sum[y+1]-sum[x+1])*1.0/(x-y);
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>m;sum[1]=dep[1]=1;
for(int i=1;i<=m;i++)
cin>>a[i].y,a[i].x=i;
stable_sort(a+1,a+m+1);
for(int i=2,x;i<=n;i++){
cin>>x; dep[i] = dep[x]+1;
maxn = max(maxn , dep[i]);
sum[dep[i]]=sum[dep[i]]+1;
}
for(int i=maxn;i>0;i--)
sum[i]+=sum[i+1];
int l=1,r=1;
for(int i=1;i<=maxn;i++){
while(l<r&&slp(i,q[r])<=slp(q[r],q[r-1]))
r--;
q[++r]=i;
}
for(int i=1;i<=m;i++){
while(l<r&&a[i].y>slp(q[l],q[l+1]))
l++;
int k=q[l],Y=a[i].y,X=a[i].x;
ans[X] = k+(sum[k+1]+Y-1)/Y ;
}
for(int i=1;i<=m;i++)
cout<<ans[i]<<" ";
return 0;
}
完 结 撒 花 ! ! !
P3571 [POI2014] SUP-Supercomputer 题解的更多相关文章
- P3571 [POI2014]SUP-Supercomputer
*X. P3571 [POI2014]SUP-Supercomputer 题意简述:一棵以 \(1\) 为根的树.\(q\) 次询问,每次给出 \(k\),求至少要多少次同时访问不超过 \(k\) 次 ...
- BZOJ3524 & LOJ2432:[POI2014]代理商Couriers——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3524 https://loj.ac/problem/2432 给一个长度为n的序列a.1≤a[i] ...
- 单调队列优化DP || [Poi2014]Little Bird || BZOJ 3831 || Luogu P3572
题面:[POI2014]PTA-Little Bird 题解: N<=1e6 Q<=25F[i]表示到达第i棵树时需要消耗的最小体力值F[i]=min(F[i],F[j]+(D[j]> ...
- DP 优化方法大杂烩 & 做题记录 I.
标 * 的是推荐阅读的部分 / 做的题目. 1. 动态 DP(DDP)算法简介 动态动态规划. 以 P4719 为例讲一讲 ddp: 1.1. 树剖解法 如果没有修改操作,那么可以设计出 DP 方案 ...
- 题解-POI2014 Supercomputer
Problem 辣鸡bzoj权限题,洛谷链接 题意概要:一棵 \(n\) 个点有根树.\(Q\) 次询问给出一个 \(K\),回答遍历完整棵树所需最少操作次数.每次操作可以选择访问不超过 \(K\) ...
- 题解 洛谷 P3571 【[POI2014]SUP-Supercomputer】
由数据范围可得出,不可能一次一次去进行回答询问,只能离线处理,然后\(O(1)\)解决. 考虑\(DP\)解决,先给出\(DP\)方程: \(f_i=max(j+ \lceil \frac{s_{j+ ...
- POI2014题解
POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...
- 【BZOJ】3835: [Poi2014]Supercomputer
题意 \(n(1 \le 1000000)\)个点的有根树,\(1\)号点为根,\(q(1 \le 1000000)\)次询问,每次给一个\(k\),每一次可以选择\(k\)个未访问的点,且父亲是访问 ...
- BZOJ3835: [Poi2014]Supercomputer
Description Byteasar has designed a supercomputer of novel architecture. It may comprise of many (id ...
- BZOJ3835[Poi2014]Supercomputer——斜率优化
题目描述 Byteasar has designed a supercomputer of novel architecture. It may comprise of many (identical ...
随机推荐
- 如何配置docker pull代理
参考: https://blog.csdn.net/vic_qxz/article/details/130061661 经过验证确实有效.
- 再谈《强化学习算法之DQN算法中的经验池的实现》 experience_replay_buffer模块的实现
去年曾写过一篇DQN经验池模块编写的博文: 强化学习算法之DQN算法中的经验池的实现,experience_replay_buffer部分的实现 最近又看到了一个经验池实现的代码,把这两个实现做了一下 ...
- Apache DolphinScheduler 3.2.1 版本发布:增强功能与安全性的全面升级
近期,Apache DolphinScheduler 社区激动地宣布 3.2.1 版本的发布.此次更新不仅着力解决了前一版本(3.2.0)中遗留的问题,而且引入了一系列的功能增强和优化措施. 原先的问 ...
- win7安装snmp服务
一.安装SNMP Win7操作系统默认情况下是不安装SNMP服务的,今天讲解一下在Win7操作系统下安装SNMP,具体安装步骤如下: 打开控制面板--卸载程序 WIN7操作系统下安装SNMP的步骤如下 ...
- 痞子衡嵌入式:在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将尽可能多的代码重定向到RAM中执行的方法. 最近和同事在讨论一个客户案例,客户 APP 工程是基于 IAR 开发环境 ...
- 【YashanDB知识库】23.1.3.101版本创建物化视图coredump
[标题]23.1.3.101版本创建物化视图coredump [问题分类]数据库错误 [关键词]YashanDB, 物化视图, coredump, dblink [问题描述]在23.1.3.101版本 ...
- CSS – PostCSS
前言 我第一次接触 PostCSS 是在学 Tailwind CSS 的时候. 它类似 JavaScript 的 Babel. 我没有用过 Babel, 因为 TypeScript 用的早. Post ...
- Azure 学习笔记
选择 VM 配套 https://docs.azure.cn/zh-cn/virtual-machines/sizes https://docs.azure.cn/zh-cn/virtual-mac ...
- 微信js-sdk接入原理
1.有一个微信公众号,并获取到该公众号的AppID和AppSecret. 其中AppID是可以对外公开的,AppSecret是该公众号的密钥,是需要绝对保密的 2.向微信服务器发送一个GET请求,获取 ...
- 某游戏厂商 hdfs 迁移 distcp failing write attempt Tried pipline recovery 5 times without success 问题排查
报错截图: 从报错信息看是 distcp 起的map 任务在写 hdfs 的 pipline 失败了,并且重试了5次没有成功,所以这个 task 直接抛出错误失败被 kill 了. 先说解决办法: 清 ...