题链:

http://www.lydsy.com/JudgeOnline/problem.php?id=4237

题解:

CDQ分治,单调栈

把所有点先按x从小到大排序,然后去CDQ分治y坐标。
在分治的每一层,把所有的点平均地分为上下两个部分,
然后计算下面的点可以对上面的每个点分别造成多少的贡献:
(也就是说,对于上面的每个点,以它作为右上角,看下面的点中有多少个合法的左下角)
假设现在枚举到了上面的第k个点,
如果下面存在这样两个点i,j满足Xi<Xj且Yi<Yj,那么必然i点无法作为一个合法的左下角。
所以我们对下面的X坐标小于Xk的点维护一个Y单调下降的栈,
那么现在是不是栈的大小就是对k点而言,下面合法的左下角的点数。
答案是否定的,因为k点同样会受到上面的点对它的影响,
考虑在上面部分存在这么一个点w,满足Xw<Xk且Yw<Yk,
那么必然在下面部分的合法的左下角的x坐标要大于Xw。
所以具体做法就是,对上面的点维护一个单调上升的栈,对下面的点维护一个单调下降的栈,
然后对于每个上面的点,在下面的点维护出来的单减栈中去二分出合法的左下角的个数,然后累加进答案。
复杂度$O(Nlog^2N)$

代码:

#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
long long ANS;
int N,intop,detop;
int A[MAXN],instk[MAXN],destk[MAXN];
struct Point{
int x,y;
bool operator <(const Point &rtm) const{
return x<rtm.x;
}
}P[MAXN];
int binary(int l,int r,int v){
static int mid,ret; ret=r+1;
while(l<=r){
mid=(l+r)>>1;
if(destk[mid]>v) ret=mid,r=mid-1;
else l=mid+1;
}
return ret;
}
void CDQ(int l,int r){
static int tmpl[MAXN],tmpr[MAXN];
if(l==r) return;
int mid=(l+r)>>1,bl=l-1,br=mid,p;
intop=detop=0;
for(int i=l;i<=r;i++){
if(A[i]>mid){
while(intop&&A[instk[intop]]>A[i]) intop--;
instk[++intop]=i; tmpr[++br]=A[i];
p=binary(1,detop,instk[intop-1]); ANS+=detop-p+1;
}
else{
while(detop&&A[destk[detop]]<A[i]) detop--;
destk[++detop]=i; tmpl[++bl]=A[i];
}
}
for(int i=l;i<=mid;i++) A[i]=tmpl[i];
for(int i=mid+1;i<=r;i++) A[i]=tmpr[i];
CDQ(l,mid); CDQ(mid+1,r);
}
int main(){
static int tmpy[MAXN];
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%d%d",&P[i].x,&P[i].y);
tmpy[i]=P[i].y;
}
sort(P+1,P+N+1); sort(tmpy+1,tmpy+N+1);
for(int i=1;i<=N;i++) A[i]=lower_bound(tmpy+1,tmpy+N+1,P[i].y)-tmpy;
CDQ(1,N);
printf("%lld\n",ANS);
return 0;
}

  

●BZOJ 4237 稻草人的更多相关文章

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

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

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

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

  3. bzoj 4237: 稻草人

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

  4. bzoj 4237 稻草人 CDQ

    稻草人 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1433  Solved: 626[Submit][Status][Discuss] Descr ...

  5. bzoj 4237稻草人

    按x轴进行分治,将[l,r]分成[l,mid]和[mid+1,r],左下角点x值在[l,mid]中,右上角点x值在[mid+1,r],然后将[l,r]中的所有点按y轴排序,按顺序扫描,若扫描到左下角点 ...

  6. 稻草人(bzoj 4237)

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

  7. bzoj 4237 稻 草 人

    bzoj 这个矩形有三个限制,分别是右上角点的横纵坐标分别大于左下角废话,并且中间区域没有点.那么可以先按横坐标排序,然后枚举左边的点和右边的点匹配.为了保证复杂度,这里每次把点集一分为二,先递归处理 ...

  8. BZOJ 4236~4247 题解

    BZOJ 4236 JOIOJI f[i][0..2]表示前i个字符中′J′/′O′/′I′的个数 将二元组<f[i][0]−f[i][1],f[i][1]−f[i][2]>扔进map,记 ...

  9. $CDQ$分治总结

    A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...

随机推荐

  1. beta冲刺4

    昨天的问题: 我的社团数据库表项的处理,代码修改后结果无法显示. 帖子内容无法显示出来. 首页图像未替换 登陆整合没有完成 今天的完成: 服务器部署成功 页面背景修改.(已上传,未确认实装.) 任务截 ...

  2. django搭建web (五) views.py

    http请求: HttpRequest http响应: HttpResponse 所在位置:django.http isinstance(request,HttpResponse) True-> ...

  3. 【iOS】Swift类的继承、构造方法、析构器等复习

    一.继承与重写, 防止重写 1.1 基类, 不继承任何类. Swift不想OC或者Java中继承自Object类.定义一个类,不继承任何类,该类就是基类. [java] view plaincopy ...

  4. C++高效安全的运行时动态类型转换

    关键字:static_cast,dynamic_cast,fast_dynamic_cast,VS 2015. OS:Window 10. C++类之间类型转换有:static_cast.dynami ...

  5. DenseNet

    特点: dense shortcut connections 结构: DenseNet 是一种具有密集连接的卷积神经网络.在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有 ...

  6. Nginx动静分离架构

    Nginx动静分离简单来说就将动态与静态资源分开,不能理解成只是单纯的把动态页面和静态页面物理分离,严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat,Res ...

  7. tensorflow安装篇

    安装虚拟机redhat7u4-64 镜像文件在http://www.linuxfly.org/post/659 更换yum 参考https://blog.csdn.net/xiaoyiaoyou/ar ...

  8. Server.MapPath找不到命名空间,解决办法

    最近在做微信公众号开发,在网上找了个例子实现获取Access_token的值,需要读取xml文件,结果就遇到这个问题

  9. poj 2945 Find the Clones

    https://vjudge.net/problem/POJ-2945 题意: 给出n个长度相同的DNA序列,如果一个DNA序列出现过两次,那么就有说明它被复制了一次.问被复制0次,1次,2次--n- ...

  10. Hadoop:读取hdfs上zip压缩包并解压到hdfs的实现代码

    背景: 目前工作中遇到一大批的数据,如果不压缩直接上传到ftp上就会遇到ftp空间资源不足问题,没办法只能压缩后上传,上穿完成后在linux上下载.但是linux客户端的资源只有20G左右一个压缩包解 ...