Codeforces Round 905 (Div. 1)
最幸运的一次!除了 F 都过了。
A1/A2.Dances
注意到我们等价于找最大匹配,把两个序列混合一起排序后,等价于把 \(a\) 看成左括号,\(b\) 看成右括号求括号匹配。
A2 的话,先求出没有被消掉的最大的 \(b_j=x\),那么只要 \(a_1<x\) 就能增加一个匹配,否则不能,简单维护即可。
B.Time Travel
魔改一下,Dijkstra,用一条边更新的时候二分出这条边第一次出现的时间即可。
每条边只会被更新一次,复杂度线性对数。
C.Minimum Array
最小化字典序,我们考虑按位确定,用线段树维护当前位置每个操作后的值,可以扫描维护。
然后每一位把不等于最小值的操作删掉即可,均摊线性对数。
D.Split
从小到大依次加点,用 01 表示每个数和当前值的大小关系,那么一个合法区间就是存在某个时刻使得一个前缀是 0 另一半是 1,注意到每次加点只会生成最多一个这样的极大区间,总共只有 \(O(n)\) 个,看成是若干个矩形,跑一遍扫描线就能知道每个询问点是否被覆盖了。
E.Good Colorings
简单构造。
看到矩阵很自然想到二分图,注意到 \(2n\) 个点 \(2n\) 条边一定有环,并且一定是偶环。
问一下环中间的两个点的颜色,这样的环可以被*似*分,并且这条边的颜色一定在某一边里没出现。
这样不断缩小环的规模直到环长 \(=4\) 即可。