【题解】CF1556G Gates to Another World
常见套路正难则反,考虑从后往前做。
可以发现最后剩下 \(O(m)\) 个区间,每个区间有一个"被删除的时间",如果至始至终都没被删除的区间,定义其"被删除的时间"为 \(m+1\) 。
将这些区间丢到线段树上,再从线段树上将这些区间扒下来,此时每个区间长度一定是 \(2^k\),接下来考虑连边。
对于某个线段树节点,左右儿子中对应位置所代表的值,在二进制表示下恰好相差一位,可以考虑对应位置连边。时间复杂度和线段树合并同理。
最后应该得到了 \(O(n^2m)\) 条边,仍然从后往前做。一条边的出现时间即为两端点中第一个被删除的那个的删除时间之前。用并查集维护连通性即可。
代码:Submission #127672748 - Codeforces
整个题思路捋下来还是很顺畅的。我曾经考虑过直接对最后剩下的区间缩点然后倒着做啥的(虽然我也不知道我到底在想什么 ..),感觉容易想题想歪。一个点在于区间总数为 \(O(m)\),另一个在于上线段树连边(其实是 01 trie),用线段树合并来证复杂度。