传送门

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


最开始想到的是类似于楼房重建的算法,然后打炸了qwq

在多维问题上考虑分治可以降低一维限制,很多时候都会用到(比如三维偏序)。

我们先对$y$值从小到大排序,在分治内部对$x$值从小到大排序,然后考虑左边一半对右边的贡献。

可以知道对于左边一半的两个点$a,b(a<b)$,如果$y_a<y_b$,那么$a$会被$b$阻挡,就不会对答案产生贡献。所以我们可以维护一个$y$值递减的单调栈来保存可能对当前询问的点产生贡献的左边的点的集合,每一次询问下一个点时,把$x$值小于它的其他点加入单调栈即可。

接下来我们考虑右边的点对右边产生的影响(右边的某一些点阻挡了某一些左边的点产生贡献)。发现我们同样可以维护一个$y$值递增的单调栈来保存对当前点有影响的点的集合。每一次我们就取出栈顶的点,在左边的点对应的集合上二分,就可以得到它使多少个左边的点不产生贡献了。

 //This code is written by Itst
 #include<bits/stdc++.h>
 #define BZ
 #define mid ((l + r) >> 1)
 using namespace std;

 inline int read(){
     ;
     ;
     char c = getchar();
     while(c != EOF && !isdigit(c)){
         if(c == '-')
             f = ;
         c = getchar();
     }
     while(c != EOF && isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return f ? -a : a;
 }

 ;
 struct node{
     int x , y;
 }now[MAXN];
 int N , hd , Stack[MAXN] , Stack2[MAXN] , top;
 long long ans;

 bool cmp1(node a , node b){
     return a.y < b.y;
 }

 bool cmp2(node a , node b){
     return a.x < b.x;
 }

 inline int bis(int x){
      , R = hd;
     while(L < R){
          >> ;
         now[Stack[m]].x < x ? L = m : R = m - ;
     }
     return L;
 }

 void solve(int l , int r){
     if(l == r)
         return;
     solve(l , mid);
     solve(mid +  , r);
     ;
     hd = top = ;
     while(p2 <= r){
         while(top && now[Stack2[top]].y > now[p2].y)
             --top;
         Stack2[++top] = p2;
         while(p1 <= mid && now[p1].x < now[p2].x){
             while(hd && now[Stack[hd]].y < now[p1].y)
                 --hd;
             Stack[++hd] = p1++;
         }
         ans += hd - (top ==  ?  : bis(now[Stack2[top - ]].x));
         p2++;
     }
     sort(now + l , now + r +  , cmp2);
 }

 int main(){
 #ifdef BZ
     freopen("4237.in" , "r" , stdin);
     freopen("4237.out" , "w" , stdout);
 #endif
     N = read();
      ; i <= N ; i++){
         now[i].x = read();
         now[i].y = read();
     }
     sort(now +  , now + N +  , cmp1);
     solve( , N);
     cout << ans;
     ;
 }

BZOJ4237 JOISC2014 稻草人 CDQ分治、单调栈的更多相关文章

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

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

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

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

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

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

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

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

  5. [BZOJ4237]稻草人:CDQ分治+单调栈

    分析 按\(y\)排序后CDQ分治,可以发现每个点可以影响的是\(x\)坐标的一段区间,可以使用扫描线+单调栈,在单调栈上二分即可解决,时间复杂度\(O(n \log^2 n)\). 通过归并排序可以 ...

  6. Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】

    正题 题目链接:https://loj.ac/problem/2880 题目大意 给出平面上的\(n\)个点,然后求有多少个矩形满足 左下角和右上角各有一个点 矩形之间没有其他点 \(1\leq n\ ...

  7. 【bzoj4237】稻草人 分治+单调栈+二分

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

  8. BZOJ4237 稻草人 分治 单调栈

    原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^ ...

  9. 【BZOJ4237】稻草人 [分治][单调栈]

    稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description JOI村有一片荒地,上面竖着N个稻草 ...

随机推荐

  1. 【转】Max2013脚本工具的乱码问题

    转自:http://www.cnblogs.com/sitt/archive/2012/11/21/2780481.html 有时一些中文的脚本会在max2013中显示为乱码,是因为max2013将多 ...

  2. 使用过AsyncTask、EventBus、Volley以及Retrofit,必须好好了解handler运行机制

    我们都知道在UI线程中不能进行耗时操作,例如数据读写.网络请求.Android 4.0开始,在主线程中进行网络请求甚至会抛出Android.os.NetworkOnMainThreadExceptio ...

  3. 针对模拟滚动条插件(jQuery.slimscroll.js)的修改

    在开发过程中程序员总会碰到产品经理提出的各种稀奇古怪的需求,尽管有些需求很奇葩,但不得不说有些须有还是能指引我们不断的学习与进步,最近在工作中就碰到这种问题.需求是要求在各主流浏览器上使用自定义的滚动 ...

  4. Appium学习——安装appium Server

    安装appium Server 下载地址:百度网盘的下载链接:https://pan.baidu.com/s/1pKMwdfX 下载后, AppiumForWindows.zip 进行解压,点击 ap ...

  5. python 3.3.2报错:No module named 'urllib2'

    ModuleNotFoundError: No module named 'urllib3' 1. ImportError: No module named 'cookielib'1 Python3中 ...

  6. vi 复制或剪切多行超级强大方法

    同一个文件:光标移到起始行,输入ma 光标移到结束行,输入mb 光标移到粘贴行,输入mc 然后 :'a, 'b co 'c 把 co 改成 m 就成剪切了多个文件:在文件一: 光标移到起始行,输入ma ...

  7. Linux下内存查看命令

    在Linux下面,我们常用top命令来查看系统进程,top也能显示系统内存.我们常用的Linux下查看内容的专用工具是free命令. Linux下内存查看命令free详解: 在Linux下查看内存我们 ...

  8. 上下文管理器——with语句的实现

    前言 with语句的使用给我们带来了很多的便利,最常用的可能就是关闭一个文件,释放一把锁. 既然with语句这么好用,那我也想让我自己写的代码也能够使用with语句,该怎么实现? 下面具体介绍怎样实现 ...

  9. Linux运维之每日小技巧-检测网站状态以及PV、UV等介绍

    [root@ELK-chaofeng07 httpd]# curl -o /dev/null -w %{http_code}\\n -s www.baidu.com 状态码为200表示成功. PV.U ...

  10. ccf-20161203--权限查询

    这题我的思路是将用户直接与他的权限联系起来.比如: 用户 角色 权限 Alice hr crm:2直接转变为:Alice: crm:2 题目与代码如下: 问题描述 试题编号: 201612-3 试题名 ...