题目描述

JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典。
有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件:
田地的形状是边平行于坐标轴的长方形;
左下角和右上角各有一个稻草人;
田地的内部(不包括边界)没有稻草人。
给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数

输入

第一行一个正整数N,代表稻草人的个数
接下来N行,第i行(1<=i<=N)包含2个由空格分隔的整数Xi和Yi,表示第i个稻草人的坐标

输出

输出一行一个正整数,代表遵从启示的田地的个数

样例输入

4
0 0
2 2
3 4
4 3

样例输出

3


题解

自己yy出来的分治+单调栈+二分

如果直接对于每个点求以它为顶点的满足条件的矩形数目比较难求,所以考虑分治处理。

按x分治,处理完左右区间后处理左边对右边的影响。

此时左半部分的x严格小于右半部分的x,如果再按x排序则没有意义,所以按照y排序。

按照y从小到大排序后,遍历区间内所有的点。对于每个右半部分的点,在左半部分里寻找答案。

我们思考:如果在左半部分扫到了这样两个点a、b:ay>by且ax>bx,那么在按y从小到大遍历时,剩下的点的y都比这两个点大,画图可知b不可能再形成矩形,所以弹掉。

即对左半部分维护一个从栈底到栈顶x值递减的单调栈,碰到不满足条件的则弹出。

再考虑右半部分:如果扫到了这样两个点a、b:ay>by且ax<bx,那么这两个点是互不影响的,直接寻找答案即可。所以b没有意义,所以弹掉。而当ay>by且ax>bx时,b限制了a形成的矩形的范围,所以应当保留,并且在遍历到a时在左半部分中二分。

即对右半部分维护一个从栈底到栈顶x值递增的单调栈,碰到不满足条件的则弹出。

综上,我们维护两个单调栈,每次遍历到一个点,就把它压到对应的单调栈中,如果这个点是右半部分的点,就在左半部分的单调栈中二分求出比栈顶元素y值大的点的个数,并累加到答案中。注意左右部分的单调栈是不同的,因为它们的意义是不同的。

这样做的时间复杂度是$O(n\log^2n)$,亲测使用归并排序,二分的常数极小,可以使时间减到5s左右。

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define N 200010
  4. using namespace std;
  5. struct data
  6. {
  7. int x , y;
  8. }a[N] , tmp[N];
  9. int s1[N] , t1 , s2[N] , t2;
  10. long long ans;
  11. bool cmp(data a , data b)
  12. {
  13. return a.x < b.x;
  14. }
  15. int getnum(int t)
  16. {
  17. int l = 1 , r = t1 , mid , tmp = t1 + 1;
  18. while(l <= r)
  19. {
  20. mid = (l + r) >> 1;
  21. if(a[s1[mid]].y >= t) tmp = mid , r = mid - 1;
  22. else l = mid + 1;
  23. }
  24. return t1 - tmp + 1;
  25. }
  26. void solve(int l , int r)
  27. {
  28. if(l >= r) return;
  29. int mid = (l + r) >> 1 , tx = a[mid].x , i , p1 = l , p2 = mid + 1;
  30. solve(l , mid);
  31. solve(mid + 1 , r);
  32. for(i = l ; i <= r ; i ++ )
  33. {
  34. if(p2 > r || (p1 <= mid && a[p1].y < a[p2].y)) tmp[i] = a[p1 ++ ];
  35. else tmp[i] = a[p2 ++ ];
  36. }
  37. t1 = t2 = 0;
  38. for(i = l ; i <= r ; i ++ )
  39. {
  40. a[i] = tmp[i];
  41. if(a[i].x <= tx)
  42. {
  43. while(t1 && a[i].x > a[s1[t1]].x) t1 -- ;
  44. s1[++t1] = i;
  45. }
  46. else
  47. {
  48. while(t2 && a[i].x < a[s2[t2]].x) t2 -- ;
  49. s2[++t2] = i;
  50. ans += getnum(a[s2[t2 - 1]].y);
  51. }
  52. }
  53. }
  54. int main()
  55. {
  56. int n , i;
  57. scanf("%d" , &n);
  58. for(i = 1 ; i <= n ; i ++ ) scanf("%d%d" , &a[i].x , &a[i].y);
  59. sort(a + 1 , a + n + 1 , cmp);
  60. solve(1 , n);
  61. printf("%lld\n" , ans);
  62. return 0;
  63. }

【bzoj4237】稻草人 分治+单调栈+二分的更多相关文章

  1. BZOJ4237 稻草人 分治 单调栈

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

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

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

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

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

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

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

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

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

  6. BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]

    1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 8748  Solved: 3835[Submi ...

  7. bzoj 4709 [Jsoi2011]柠檬——单调栈二分处理决策单调性

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4709 题解:https://blog.csdn.net/neither_nor/articl ...

  8. BZOJ1012最大数 [JSOI2008] 单调栈+二分

    正解:单调栈+二分查找(or,线段树? 解题报告: 拿的洛谷的链接quq 今天尝试学习了下单调栈,然后就看到有个博客安利了这个经典例题?于是就去做了,感觉还是帮助了理解趴quqqqqq 这题,首先,一 ...

  9. 51NOD 1962 区间计数 单调栈+二分 / 线段树+扫描线

     区间计数   基准时间限制:1.5 秒 空间限制:262144 KB 分值: 80   两个数列 {An} , {Bn} ,请求出Ans, Ans定义如下: Ans:=Σni=1Σnj=i[max{ ...

随机推荐

  1. SQL还原数据库

    还原一个备份数据库的经历. 首先,手头上有工程文件及相应的数据库的备份. 步骤: 1.在工程文件里找到配置文件,我这个是在bin目录里找到config.ini 2.双击打开它,里面有一些数据库的相关信 ...

  2. js生成txt文件

    HTML CODE: <div class="modal-footer"> <a onfocus="this.blur();" id=&quo ...

  3. java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9A\x84...' for column 'groupName'

    java.sql.SQLException: Incorrect string value: '\xE6\x88\x91\xE7\x9A\x84...' for column 'groupName' ...

  4. URL URI URN的区别

    下面这张图可以完美的解释他们三者之间的关系 URI包含URL和URN Uniform Resource Identifier :统一资源标志符,用于标识某一互联网资源 Uniform Resoutce ...

  5. [NOI2010]海拔——最小割+对偶图

    题目链接 SOLUTION 想一下最优情况下肯定让平路或下坡尽量多,于是不难想到这样构图:包括左上角的一部分全部为\(0\),包括右下角的一部分全部为\(1\),于是现在问题转化为求那个分界线是什么. ...

  6. javase(5)_面向对象

    一.概述 1.面向对象是一种思想,让我们由执行者变成指挥者,执行者是面向过程,指挥者是面向对象.例如人开冰箱门,开冰箱门这个动作应该属于门而不是人,冰箱自己最清楚门应该怎么开,人只是调用了冰箱的这个动 ...

  7. 【求助】NdisSend,自定义数据包发送失败?

    做ndis hook的时候,自定义了一个数据包,包结构应该没有问题,填充NDIS_PACKET结构是这样的,先初始化:        NdisAllocatePacketPool(&nStat ...

  8. GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 (线段树)

    GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 GSS4 - Can you answer these qu ...

  9. (12)zabbix agent 类型所有key

    zabbix服务器端通过与zabbix agent通信来获取客户端服务器的数据,agent分为两个版本,其中一个是主动一个是被动,在配置主机我们可以看到一个是agent,另一个是agent(activ ...

  10. linux内核数据结构

    https://blog.csdn.net/zhangskd/article/details/11225301 在看ip_acct.c相关代码时看到大量使用了 hlist_nulls_for_each ...