zoukankan      html  css  js  c++  java
  • 模拟110 题解

    A. 最大或

    因为或运算特殊的性质,从高位到低位进行贪心。

    将$l$,$r$的二进制位分别取出,

    从高到低枚举每一位,

    当存在一个二进制位不同,即在此位$l$为$0$而$r$为$1$。

    那么$x$可以选择后面每个二进制位中的$1$,保证低位贡献的最大化,$y$只要保证高位的贡献就可以了。

    B. 答题

    暴力做这道题比较简单,

    然后发现数据范围显然是在提示$meet in the middle$。

    所以二分答案+单调指针扫就可以了。

    C. 联合权值·改

    本题中要用到的一个结论,图中出现的三元环个数不超过$m^{1.5}$。

    以下是证明:

    考虑任何一个三元环$(a,b,c)$,可以按照一种顺序唯一表示。

    查找三元环的方法是:一层循环枚举$a$,二层循环枚举$a$的出边$b$,三层循环枚举$b$的出边$c$,之后判断$a$,$c$之间是否有边。

    然而暴力按照编号的顺序做的复杂度还是不正确的。

    正确的方法是按照度数从大到小找。

    可以发现,

    1.对于度数大于$sqrt m$的点,只有不超过$sqrt m$个,

    对于每个点,设度数为$k$,那么这个点被拓展为中间点的次数不超过$frac{m}{k}$次,能拓展到的点不超过$k$个,

    单个点的复杂度不超过$O(m)$,故其总复杂度为$O(m*sqrt m)$。

    2.对于度数小于$sqrt m$的点,

    所有的点总共会被拓展为中间点不超过$m$次,其中每个点能拓展到的点不超过$sqrt m$个。

    故其总复杂度为$O(m*sqrt m)$。

    由上述,在本题中三元环的个数是可以枚举的。

    有了这个结论,可以直接暴力做这道题。

    对于最大值,

    外层枚举中间点,将所有的出边到达的点按点权排序,两层循环接着枚举,

    因为点权从大到小排序,可以在找到一组答案后直接跳出循环。

    因为没有找到一组答案仅当遇到三元环,而三元环个数是合法的,所以总复杂度也是合法的。

    对于权值和,

    外层枚举中间点,之后可以直接统计贡献。

    算重的贡献仅有三元环和同一个点。

    对于后一个贡献直接减掉,前一个贡献在找三元环的过程中减掉就可以了。

  • 相关阅读:
    【汇编程序】出地址为BUF的5个字符数组的内容之和
    Ugly Number
    Best Time to Buy and Sell Stock IV****
    Best Time to Buy and Sell Stock III
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock II
    House Robber II
    Contain Duplicate III*******
    Contain Duplicate II
    Contain Duplicate
  • 原文地址:https://www.cnblogs.com/skyh/p/11837918.html
Copyright © 2011-2022 走看看