zoukankan      html  css  js  c++  java
  • CodeForces 603E Pastoral Oddities

    CodeForces 603E Pastoral Oddities

    https://codeforces.com/contest/603/problem/E

    https://codeforces.com/blog/entry/21885

    Snipaste_2020-02-27_15-40-23.png

    Tutorial

    Hint

    • 存在 sunny paving 的充要条件是什么
    • 题目与最小生成树有无关系

    我们有 (n) 个点, (m) 条边,称每个点度数为奇数的方案为 sunny paving.

    Lemma

    一个联通图存在 sunny paving 当且仅当节点数为偶数

    证明

    首先证明所有点数为偶数的图都存在sunny paving.

    我们随意找这个联通图的一个生成树,从叶子开始贪心的构造,然后除了根以外所有点相邻的 paved 边都是奇数. 考虑只有 paved 边的图,由于总度数为偶数,所以根相邻的paved边个数也是奇数.

    然后证明所有点数为奇数的图都不存在sunny paving

    假设存在sunny paving,那么所有点度数的和就是奇数,这是不可能的.

    现在我们只关心每个联通块大小的奇偶性.

    加入我们只计算一次,我们可以用kruskal算法,直到每个联通块点数为偶数时停下.如果不存在则无解,复杂度 (O(m log n))

    为了加速,我们维护kruskal算法的结束为止.用LCT来维护.

    首先类比我们如何在线的维护最小生成树的,如果 (u,v) 不联通,则加入.否则,查询 (u,v) 间的最长边,如果它的长度更大,则将它删除,并加入 (u,v) .

    会到原本的问题,注意我们的状态相当于用kruskal找最小生成树检查了 (k) 条边后的状态(我们也不再关心 (k) 条边之后的边).所以当我们向森林里添加一条边时,我们可以用维护最小生成树的方法,得到检查之前的 (k) 条边与新加入的这条边之后的最小生成树.

    那么我们可以一次检查着 (k+1) 条边的最长边是否有必要,即删掉这条边后是否分出了点数为奇数的联通块.然后我们就可以得到第一次所有联通块为偶数的时间.这样每条边的均摊复杂度是 (O(log n)) 的,总的复杂度为 (O(m log n))

  • 相关阅读:
    HTML5 <meta> 标签属性,所有meta用法
    C#中导出数据到Excel表格中 逗号
    .net MVC 中缓存的使用 逗号
    MVC 过滤器 逗号
    .Net 分布式技术比较 逗号
    将DataTable导出为Excel (XML Spreadsheet).
    AntiTD
    三星WP7手机MANGO一分钟完美越狱
    SPGridView 研究笔记 Part 3 分组
    Silverlight 4 Binding Cheatsheet [转]
  • 原文地址:https://www.cnblogs.com/ljzalc1022/p/13191034.html
Copyright © 2011-2022 走看看