先按y排序,二分,两边递归下去,然后处理下半部分对上半部分的贡献,即左下点在下半部分,右上点在上半部分的合法矩形个数。

两个部分均按x排序,枚举右上点p,则左下点需要满足:

1.横坐标大于上半部分纵坐标比p小的点的最大横坐标k。

2.不存在下半部分点满足纵坐标在两点之间,横坐标也在两点之间。

这样,我们对上半部分维护一个纵坐标单减的单调栈,下半部分维护纵坐标单增的单调栈。

每次枚举p时,将下半部分所有横坐标小于p的点加入栈中,再在栈中二分k即可。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
ll ans;
int n,stk1[N],stk2[N];
struct P{ int x,y; }p[N];
bool cmpx(const P &a,const P &b){ return a.x<b.x; }
bool cmpy(const P &a,const P &b){ return a.y<b.y; } void solve(int L,int R){
if (R<=L) return;
sort(p+L,p+R+,cmpy); int mid=(L+R)>>;
sort(p+L,p+mid+,cmpx); sort(p+mid+,p+R+,cmpx);
int top1=,top2=,w=L;
rep(i,mid+,R){
while (top1 && p[stk1[top1]].y>p[i].y) top1--;
stk1[++top1]=i;
while (w<=mid && p[w].x<p[i].x){
while (top2 && p[stk2[top2]].y<p[w].y) top2--;
stk2[++top2]=w; w++;
}
int l=,r=top2,pos=-;
while (l<=r){
int m=(l+r)>>;
if (p[stk2[m]].x>p[stk1[top1-]].x) pos=m,r=m-; else l=m+;
}
if (~pos) ans+=top2-pos+;
}
solve(L,mid); solve(mid+,R);
} int main(){
freopen("bzoj4237.in","r",stdin);
freopen("bzoj4237.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%d%d",&p[i].x,&p[i].y);
p[]=(P){-,-}; solve(,n); printf("%lld\n",ans);
return ;
}

[BZOJ4237]稻草人(CDQ分治)的更多相关文章

  1. bzoj4237: 稻草人 cdq分治 单调栈

    目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...

  2. $bzoj4237$稻草人 $cdq$分治

    正解:$cdq$分治 解题报告: 传送门$QwQ$ $umm$总感觉做过这题的亚子,,,? 先把坐标离散化,然后把所有点先按$x$排序$QwQ$,然后用类似平面最近点对的方法,先分别解决$mid$两侧 ...

  3. 【BZOJ4237】稻草人 cdq分治+单调栈+二分

    [BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...

  4. 【BZOJ4237】 稻草人 CDQ分治+单调栈

    ## 题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下 ...

  5. bzoj 4237: 稻草人 -- CDQ分治

    4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行 ...

  6. bzoj 4237 稻草人 - CDQ分治 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...

  7. BZOJ4237 JOISC2014 稻草人 CDQ分治、单调栈

    传送门 题意:给出平面上$N$个点,求满足以下两个条件的矩形:①左下角与右上角各有一个点:②矩形内部没有点.$N \leq 2 \times 10^5$,所有数字大于等于$0$,保证坐标两两不同 最开 ...

  8. BZOJ4237 稻草人(分治+树状数组+单调栈)

    如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...

  9. 【BZOJ4237】稻草人(CDQ分治,单调栈)

    [BZOJ4237]稻草人(CDQ分治,单调栈) 题面 BZOJ 题解 \(CDQ\)分治好题呀 假设固定一个左下角的点 那么,我们可以找到的右下角长什么样子??? 发现什么? 在右侧是一个单调递减的 ...

随机推荐

  1. HDU 2319 Card Trick (模拟)

    题目链接 Problem Description The magician shuffles a small pack of cards, holds it face down and perform ...

  2. IE6透明PNG解决方案

    IE6不支持PNG-24图片一直困扰很多人,但是可以通过IE的独有的滤镜来解决,解决的方案很多,比如:将滤镜写在CSS里,还可以写成单独的 Javascript文件,本来认为推荐两种做法:第一种,将所 ...

  3. 013 GC机制

    本文转自:https://www.cnblogs.com/shudonghe/p/3457990.html 最近还是在找工作,在面试某移动互联网公司之前认为自己对Java的GC机制已经相当了解,其他面 ...

  4. Tutorial 3: Class-based Views

    转载自:http://www.django-rest-framework.org/tutorial/3-class-based-views/ Tutorial 3: Class-based Views ...

  5. jQuery对的表单数据序列化和校验

    jQuery对的表单数据序列化和校验 表单序列化 如果想让表单通过ajax异步提交,那么首先我们要通过js获取到每个表单中输入的值,如果表单项比较多的话,是一件很麻烦,很痛苦的事情,那么我们可以通过j ...

  6. C#串口serialPort操作

    现在大多数硬件设备均采用串口技术与计算机相连,因此串口的应用程序开发越来越普遍.例如,在计算机没有安装网卡的情况下,将本机上的一些信息数据 传输到另一台计算机上,那么利用串口通信就可以实现.运行本程序 ...

  7. BootStarp的form表单的基本写法

    代码如下: <!DOCTYPE html> <html> <head> <title>BootStrap的基础入门</title> < ...

  8. Ecshop二次开发修改

    所有的错误,根据下面这个帖子修改 http://bg.artuion.com/328.html 修改错误: 第300行 原有内容: //return preg_replace("/{([^\ ...

  9. MVC公开课 – 1.基础 (2013-3-15广州传智MVC公开课)

    1.MVC设计模式 Model 是指 要处理的业务代码和数据操作代码 View 视图 主要是指的 跟用户打交道 并能够展示数据 Controller 看成是 Model和View的桥梁 优点: 1.1 ...

  10. ***PHP5.6.x SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 解决方案

    centos: 在php.ini中增加一行 1 openssl.cafile=/etc/pki/tls/certs/ca-bundle.crt 重启服务器使修改生效