zoukankan      html  css  js  c++  java
  • CF1439E

    E [* easy]

    大杂烩。。

    我们先证明这个图一定是树。

    先给所有边定向,这样这张图至少是一个 DAG,我们证明每个点有且仅有一个父亲就 ok 了。

    考虑 ((x,y)) 是 ok 的,那么只需要证明 ((x-1,y),(x,y-1)) 中恰好有一个是 ok 的,考虑 (x,y) 中二进制最低位较小的元素,我们必然直接减少其,同时一定 ok,不难发现给另一者 (-1) 显然是不 ok 的,

    然后根据这类博弈论的套路,在树上翻硬币可以等价于每个硬币的 SG 的异或和。

    观察一下,发现硬币的 SG 值似乎只和深度相关。

    可以对深度归纳,不难证明深度为 (i) 的点的 SG 值为 (2^i)(深度从 0 开始标号)

    于是后手赢等价于每个深度的点的数量都是偶数。

    这样可以考虑假装存在一个序列,第 (i) 位为 (1) 表示这个深度有奇数个点,那么不难发现后手的一次操作等价于给前缀异或 (1)

    于是操作次数实际上就是差分数组中 (1) 的数量。

    最后,考虑初始加入链的过程,我们只需要维护他对这个假想的数列的贡献(注意他们只有染黑操作)于是只需要将计算 LCA,然后拆成若干条直上直下的链,一种做法是建立这些点的虚树,使用差分标记维护这个点到其父亲的边是否被染黑即可,这样只需要在差分数组中加入两个 pair 即可。

    于是最后这个问题等价于在特殊树上求 (m) 对链的 LCA。

    考虑直接模拟,我们发现我们暴力跳父亲复杂度很高,但是是可以加速的。如果某段操作全是给 (x)(1) 那么是可以缩到一起的,实际上就是 (x) 的 low 小于 (y) 的 low 时可以连续跳 (2^{low(x)}) 次。

    于是我们在 (mathcal O(mlog^2 w)) 的复杂度解决了这个问题。

    代码的细节很多,我写了 3h.../ll(最后又双叒叕被卡了 vector 的常数,屑ctr爪巴)

    代码奇丑,不放了。

  • 相关阅读:
    关于Django 报错 ImportError: cannot import name RegexUrlResolver解决
    Git版本控制
    java Labmda表达式
    java注解&反射
    maven
    数据库
    为什么java中子类重写父类的方法时声明抛出异常不能比父类范围大
    【Linux】Linux基本命令
    阿里云服务器linux环境搭建SSM项目(一)--Linux环境配置jdk和Tomcat.md
    阿里云服务器linux环境搭建SSM项目(二)--linux环境配置mysql5.7.md
  • 原文地址:https://www.cnblogs.com/Soulist/p/14004169.html
Copyright © 2011-2022 走看看