博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】3835: [Poi2014]Supercomputer
阅读量:5906 次
发布时间:2019-06-19

本文共 1502 字,大约阅读时间需要 5 分钟。

题意

\(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 
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
n?mx:d[a[i]], " \n"[i==Q-1]); } return 0;}

转载地址:http://wtcpx.baihongyu.com/

你可能感兴趣的文章
mysql安装,远程连接,以及修改密码
查看>>
Mybatis查询返回Map类型数据
查看>>
java的深拷贝与浅拷贝
查看>>
程序员如何提高工作效率
查看>>
promise
查看>>
将Java应用部署到SAP云平台neo环境的两种方式
查看>>
数据批量导入Oracle数据库
查看>>
调用lumisoft组件发邮件 不需要身份验证 不需要密码
查看>>
DW 正则
查看>>
抓屏原理
查看>>
UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出
查看>>
扩展 DbUtility (1)
查看>>
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
查看>>
Hadoop学习笔记系列文章导航
查看>>
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
大数据项目实践(四)——之Hive配置
查看>>