模拟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)$。

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

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

对于最大值,

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

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

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

对于权值和,

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

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

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

posted @ 2019-11-11 20:26  skyh  阅读(236)  评论(0编辑  收藏  举报