$cdq$ 分治 + 单调栈.
将所有点先按照 $y$ 排序,然后 $cdq$ 分治,每次只考虑上面的一部分点作为右上角,下面的一部分点作为左下角的贡献.
将上下两部分的点分别按照 $x$ 排序,从左往右枚举上面的点.
发现上面的一个点在只会受到 $y$ 比自己小的点中, $x$ 最大的点的制约,维护一个 $y$ 递增的单调栈来找出这个点.
然后在下面的点中统计有哪些点是合法的,对下面的点维护一个 $y$ 不增的单调栈.
每次在上面加入点后,就将下面 $x$ 小于等于它的点加入下面的栈.
在下面的单调栈中使用二分,找出合法点的区间,时间复杂度 $O(n\log^2 n)$ .
1 |
|