CF1774G Segment Covering
非常具有价值的一个题目。
首先对于线段问题,我们希望能够用一些常见的手法给计数,发现答案要求是偶数减奇数,可以想一些在偶数和奇数中同时出现的情况,这样我们就可以不算这种情况,比如说:
- 如果存在一个区间 \([l_1, r_1]\) 包含了 \([l_2, r_2]\),此时对于所有选了 \([l_1, r_1]\) 的情况,其中 \([l_2, r_2]\) 是选或者不选都可以的,因此我们可以不记录这种情况,可以直接删去 \([l_1, r_1]\)。
这一步观察是十分重要的,更进一步:
- 如果有两个区间的并包含了一个小区间,那么假设同时选了这两条区间,那么仍然无效,一定可以推出可以将小区间删掉,因为此时若选了靠右的区间,则这个小区间选或不选均可。
最后得到的情况是区间一定能被分成两个集合,每个集合里的区间两两无交。
我们对于一个区间做这个事情,不难发现此时本质只有一种情况,我们只需要快速处理出这两个集合的大小之和即可。
做完去掉包含区间后,可以倍增每个区间后面第一个不与其相交的区间,可以证明一直跳一定是两种集合的划分情况,其它区间必定被删去。
最关键的一步是注意到大样例答案只可能是 \(-1, 0, 1\),所以思考到要去掉一些情况,从线段的性质入手我们肯定要区间都包含或者相交,进一步推导到 std 的性质。

浙公网安备 33010602011771号