• AtCoder Grand Contest 008


    AGC008

    B

    只要存在一段颜色相同且长度 (ge k) 的就合法。易证

    C

    D

    直接贪心就好了。每次选最小的 (a_i) 往最左边的空位塞 (i-1)(i)。看看是否出现不合法的情况。(a_i) 右边的 (i) 同理。

    E

    这里就说一下大致思路。

    (i o a_i) 连边构成的图称为 (G)(i o 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)) 不是全集 ( o) (d<max{dist(x,y)});条件Ⅱ:对于所有与 (x) 相邻的 (y)(f(x,d) eq 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),pin son(x)),若 (subtree(p)) 没有全被覆盖,那么直径有一端在 (subtree(p)) 中,设这个端点为 (A),另一个端点为 (B),因为 (yin subtree(p),dist(x,A)=dist(x,B)),所以 (dist(y,A)<dist(y,B)),而与 (A) 相邻的节点没有全被覆盖,所以不存在 (f(y,d')=f(x,d))。充分性显然。

    然后使用换根 dp,复杂度 (O(n))

  • 相关阅读:
    338. 比特位计数
    300.最长上升子序列
    git 钩子服务代码
    thinkphp5.1 封装文件上传模块
    Theano 基础
    使用anaconda和pycharm搭建多python本版的开发环境
    GIT常用命令
    Thinkphp 获取数据表随机值
    在Windows中利用.bat提交git代码到不同分支
    Windows .bat 常量
  • 原文地址:https://www.cnblogs.com/whx666/p/agc008.html
Copyright © 2020-2023  润新知