A Story of One Country (Hard)
https://www.luogu.com.cn/problem/solution/CF1181E2
首先考虑暴力的做法,就是每次排序然后寻找分割点,对分割点左右两边分治处理,但是这样的复杂度是 最坏情况下 O ( n 2 l o g n ) O(n^2logn) O(n2logn)
然后我们考虑优化这个算法,首先我们不能每次排序,可以用一个set维护,然后每次只需要分裂set即可,利用启发式分裂最坏情况下就是从中间分裂,这样就会有O(nlogn)次插入删除。
但是另外一个问题就是如何寻找关键点,我们可以使用一个中途相遇法来处理,我们不能将整个set都扫一遍,但是我们可以从两边一起移动,这样最坏情况下还是从中间分开,那么只需要O(n)次扫描。
所以这道题我们需要维护4个set,分别对应矩形的上下左右,然后每次同时移动这4个指针,然后遇到分割点就进行分治。
细节:
- set可以自定义比较函数,但是要写成一个结构体的形式
- set中不能有重复元素,所以需要以id为第二关键字,就不会重复了
- set构造可以通过直接给出首指针和尾指针
- set清空erase也可以通过首指针和尾指针
- 具体寻找分割点,需要按l排序然后维护r的最大值这样的方法