题目链接:bzoj4237
loj2880
考虑\(cdq\)分治,按\(x\)坐标排序,于是问题变成统计左下角在\([l,mid]\),右上角在\([mid+1,r]\)的矩形数量
我们先考虑固定左下角,来看一下右上角是如何变化的
当我们固定左下角A(橙色点)的时候,我们注意到右上角的点的\(x\)坐标单调递减,\(y\)单调递增
我们再考虑左下角发生变化的情况
此时左边有三个点\(A,B,C\),右边有四个绿色的点(不含点\(D\)),\(A\)可以和右边上方的三个点产生贡献,\(B\)只能和右边最下方的一个点产生贡献,\(C\)可以和右边的所有点产生贡献。说明对于左边的两个点\(P\)和\(Q\),如果满足\(P_x且\(P_y>Q_y\),那么可以与\(P\)产生贡献的点也可以与\(Q\)产生贡献
再来看一下上图,假设多了一个点\(D\),注意到点\(D\)在点\(E\)的左下方,这使得点\(E\)一定不会产生贡献
同理,对于左边的点,只有当前的点的左上方有原来的点的情况下,这个点和右边的点的组合才会产生影响
于是解法就比较清晰了
对于左边的点和右边的点分别维护一个单调栈,左边的点的\(x\)单调递减,右边的点的\(x\)单调递增,每次将\(y\)从小到大进行排序依次加点,维护单调栈的同时二分\(y\)统计右边有多少个合法点
#include
#include
#include
#include
#include
#include
#include
#include
#include