题目传送门

  传送点I

  传送点II

题目大意

  平面上有$n$个点。问存在多少个矩形使得只有左下角和右上角有点。

  考虑枚举左下角这个点。然后看一下是个什么情况:

  嗯对,是个单调栈。但不可能暴力去求每个点右侧和上方的点的单调栈。

  注意到如果给单调栈设个上界,那么顶多会削掉一些点,不会发生大的改变。

  考虑CDQ分治,然后按照$y$从大到小排序。枚举左边的点然后不断把右边纵坐标大于它的点加入单调栈。(把横坐标比它大的全弹掉)

  然后还需要考虑一个问题:

  

  绿色点上方的点不能选。

  如何找到这个上界?对左边开一个单调栈。然后在单调栈上二分。然后在右边的单调栈上二分可以找到有多少点不能选。

  (今天考这道题,怀疑自己是zz,左边写一个线段树找上界,右边二分了两次)

Code

  1. /**
  2. * bzoj
  3. * Problem#4237
  4. * Accepted
  5. * Time: 7540ms
  6. * Memory: 8332k
  7. */
  8. #include <algorithm>
  9. #include <iostream>
  10. #include <cstdlib>
  11. #include <cstdio>
  12. #include <ctime>
  13. #ifndef WIN32
  14. #define Auto "%lld"
  15. #else
  16. #define Auto "%I64d"
  17. #endif
  18. using namespace std;
  19. typedef bool boolean;
  20. #define ll long long
  21. const signed int inf = (signed) (~0u >> );
  22.  
  23. typedef class IO {
  24. public:
  25. int sta;
  26.  
  27. }IO;
  28.  
  29. int __tp = ;
  30. char __buf[];
  31.  
  32. #define digit(_x) ((_x) >= '0' && (_x) <= '9')
  33. #define pick(_x) ((_x) = getchar())
  34.  
  35. IO& operator >> (IO& io, int& u) {
  36. char x;
  37. while (~(x = getchar()) && !digit(x));
  38. for (u = x - ''; x = getchar(), digit(x); u = u * + x - '');
  39. return io;
  40. }
  41.  
  42. IO in;
  43.  
  44. template<typename T>
  45. void alloc(T*& p, int siz) {
  46. p = new T[(siz + )];
  47. }
  48.  
  49. typedef class Point {
  50. public:
  51. int x, y;
  52.  
  53. boolean operator < (Point b) const {
  54. if (y ^ b.y) return y > b.y;
  55. return x < b.x;
  56. }
  57. }Point;
  58.  
  59. int n;
  60. ll res = ;
  61. int *buf;
  62. Point *ps, *bp;
  63. Point *pt, *vt;
  64.  
  65. inline void init() {
  66. in >> n;
  67. alloc(vt, n);
  68. alloc(ps, n), alloc(bp, n);
  69. alloc(buf, n), alloc(pt, n);
  70. for (int i = ; i <= n; i++)
  71. in >> ps[i].x >> ps[i].y;
  72. }
  73.  
  74. inline void discrete() {
  75. for (int i = ; i <= n; i++)
  76. buf[i] = ps[i].x;
  77. sort(buf + , buf + n + );
  78. for (int i = ; i <= n; i++)
  79. ps[i].x = lower_bound(buf + , buf + n + , ps[i].x) - buf;
  80. for (int i = ; i <= n; i++)
  81. buf[i] = ps[i].y;
  82. sort(buf + , buf + n + );
  83. for (int i = ; i <= n; i++)
  84. ps[i].y = lower_bound(buf + , buf + n + , ps[i].y) - buf;
  85. }
  86.  
  87. int search(Point* pt, int tp, int y) {
  88. int l = , r = tp;
  89. while (l <= r) {
  90. int mid = (l + r) >> ;
  91. if (pt[mid].y <= y)
  92. r = mid - ;
  93. else
  94. l = mid + ;
  95. }
  96. return r + ;
  97. }
  98.  
  99. void dividing(int l, int r, int ql, int qr) {
  100. if (l == r || ql > qr)
  101. return ;
  102. int mid = (l + r) >> ;
  103. int pl = l - , pr = r + ;
  104. for (int i = ql; i <= qr; i++)
  105. if (ps[i].x <= mid)
  106. bp[++pl] = ps[i];
  107. else
  108. bp[--pr] = ps[i];
  109. reverse(bp + pr, bp + qr + );
  110. for (int i = ql; i <= qr; i++)
  111. ps[i] = bp[i];
  112.  
  113. int tp = , tp1 = ;
  114. vt[] = (Point) {inf, inf};
  115. for (int i = l; i <= pl; i++) {
  116. while (pr <= r && ps[pr].y > ps[i].y) {
  117. while (tp && pt[tp].x >= ps[pr].x)
  118. tp--;
  119. pt[++tp] = ps[pr], pr++;
  120. }
  121. int l = , r = tp1;
  122. while (l <= r) {
  123. int mid = (l + r) >> ;
  124. if (vt[mid].x >= ps[i].x)
  125. l = mid + ;
  126. else
  127. r = mid - ;
  128. }
  129. res += tp - search(pt, tp, vt[l - ].y) + ;
  130. while (tp1 && vt[tp1].x <= ps[i].x)
  131. tp1--;
  132. vt[++tp1] = ps[i];
  133. }
  134.  
  135. dividing(l, mid, ql, pl);
  136. dividing(mid + , r, pl + , qr);
  137. }
  138.  
  139. inline void solve() {
  140. sort(ps + , ps + n + );
  141. dividing(, n, , n);
  142. printf(Auto, res);
  143. }
  144.  
  145. int main() {
  146. init();
  147. discrete();
  148. solve();
  149. return ;
  150. }

bzoj 4237 稻草人 - CDQ分治 - 单调栈的更多相关文章

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

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

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

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

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

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

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

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

  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. bzoj 4237 稻草人 CDQ

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

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

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

  9. [BZOJ 3456]城市规划(cdq分治+FFT)

    [BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...

随机推荐

  1. struts2.0自定义类型转换

    在Struts2.0框架中内置了类型转换器,可以很方便的实现在八大数据类型.Date类型之间的自动转换:此外也可以根据自己的需求自定义数据转换类.如下: 首先看一下项目工程中的目录 1.在新建的web ...

  2. oracle数据库数值类型

    ---恢复内容开始--- 内容摘自网络 Oracle的数值类型有int,number,float,decimal,numberic等. NUMBER类型   定义   定义格式NUMBER (prec ...

  3. 解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集

    character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. characte ...

  4. idea上更新文件到github上

    1.不是最新文件,那么文件颜色就不一样.操作如下: 2.本地提交   .提交文件列表,提交说明,文件前后对比,确定了后就提交 3.推送到github. (1) (2)

  5. python pillow

    https://www.cnblogs.com/morethink/p/8419151.html#%E7%9B%B4%E6%8E%A5%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA ...

  6. Vue系列之 => 全局,私有过滤器

    私有过滤器也称局部过滤器 <script> // 全局过滤器 Vue.filter("datatime",function(timestr){ var tm = new ...

  7. 文件格式(图像 IO 14.3)

    文件格式 图片加载性能取决于加载大图的时间和解压小图时间的权衡.很多苹果的文档都说PNG是iOS所有图片加载的最好格式.但这是极度误导的过时信息了. PNG图片使用的无损压缩算法可以比使用JPEG的图 ...

  8. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  9. 【Hadoop学习之三】Hadoop全分布式安装

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop3.1.1 全分布式就是集群,注意配置主机名. ...

  10. Bodymovin:Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画

    转自:https://www.cnblogs.com/zamhown/p/6688369.html 大杀器Bodymovin和Lottie:把AE动画转换成HTML5/Android/iOS原生动画 ...