模拟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)$。
由上述,在本题中三元环的个数是可以枚举的。
有了这个结论,可以直接暴力做这道题。
对于最大值,
外层枚举中间点,将所有的出边到达的点按点权排序,两层循环接着枚举,
因为点权从大到小排序,可以在找到一组答案后直接跳出循环。
因为没有找到一组答案仅当遇到三元环,而三元环个数是合法的,所以总复杂度也是合法的。
对于权值和,
外层枚举中间点,之后可以直接统计贡献。
算重的贡献仅有三元环和同一个点。
对于后一个贡献直接减掉,前一个贡献在找三元环的过程中减掉就可以了。