AtCoder Grand Contest 008
B
只要存在一段颜色相同且长度 \(\ge k\) 的就合法。易证
C
略
D
直接贪心就好了。每次选最小的 \(a_i\) 往最左边的空位塞 \(i-1\) 个 \(i\)。看看是否出现不合法的情况。\(a_i\) 右边的 \(i\) 同理。
E
这里就说一下大致思路。
将 \(i\to a_i\) 连边构成的图称为 \(G\),\(i\to p_i\) 连边构成的图称为 \(G'\)。原问题给出 \(G\) ,问有多少种 \(G'\)。但我们发现,\(a_i\) 不是排列,所以 \(G\) 的形状并不优美,那么不妨考虑对于某个 \(G'\) 能得到怎样的 \(G\),然后再倒回来考虑每种情况对答案的贡献。加单来说,就是倒两次。
F
设 \(f(x,d)\) 为 \(dist(x,y) \le d\) 的所有 \(y\) 构成的集合。对于相同的 \(f(*,*)\) 我们只在 \(d\) 最小的那个计算贡献,可以发现,对于所有不是全集的 \(f(*,*)\),这样的 \(d\) 存在且唯一,对于全集在最后 \(+1\) ,做到了不重不漏。若 \(f(x,d)\) 的贡献被计算,需要满足什么条件?
先假设所有点都是特殊点。条件Ⅰ: \(f(x,d)\) 不是全集 \(\to\) \(d<max\{dist(x,y)\}\);条件Ⅱ:对于所有与 \(x\) 相邻的 \(y\),\(f(x,d)\neq f(y,d-1)\),这个条件同样可以用 \(dist\) 的形式表达。那么一遍树形(换根)dp 算出所有 \(x\) 的 \(d\) 的上界,加起来就好了。
现在有一些点不是特殊点。对于特殊点,仍然按上述方法处理。对于非特殊点 \(x\),求出 \(d\) 的上界以后,我们还要知道哪些 \(f(x,d)=f(y,d')\),\(y\) 为特殊点。只有这些 \(f(x,d)\) 有 \(1\) 的贡献。此时以 \(x\) 为根,\(f(x,d)\) 必须包含 \(y\) 所在的 \(x\) 的儿子子树内所有点。
稍微证明一下上面那个结论的必要性,由上述定义得到 \(d\) 是当前集合的最小值,即 \(x\) 为子集 \(f(x,d)\) 的直径中点,那么直径经过 \(x\) 的两个不同儿子。设 \(y\) 所在的 \(x\) 的儿子子树为 \(subtree(p),p\in son(x)\),若 \(subtree(p)\) 没有全被覆盖,那么直径有一端在 \(subtree(p)\) 中,设这个端点为 \(A\),另一个端点为 \(B\),因为 \(y\in subtree(p),dist(x,A)=dist(x,B)\),所以 \(dist(y,A)<dist(y,B)\),而与 \(A\) 相邻的节点没有全被覆盖,所以不存在 \(f(y,d')=f(x,d)\)。充分性显然。
然后使用换根 dp,复杂度 \(O(n)\)。
原文地址:https://www.cnblogs.com/whx666/p/agc008.html
- sql基础知识:分页+排序
- Elasticsearch推荐插件篇(head,sense,marvel)
- sql基础知识:日期的常用用法
- 《Effective Java》—— 对于所有对象都通用的方法
- 《Effective Java》—— 创建与销毁对象
- web调试工具——Fiddler使用介绍(一)
- Windows c++应用程序通用日志组件(组件及测试程序下载)
- 快速排序
- 如何在Elasticsearch中安装中文分词器(IK+pinyin)
- Python抓取中文网页
- 《Effective Java》—— 读后总结
- unix共享内存要点
- LAMP=Linux+Apache+Mysql+Php
- unix共享内存要点
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法