[BZOJ4237]稻草人/[JOISC2014]かかし

题目大意:

平面上\(n(n\le2\times10^5)\)个点,若一个矩形各边与坐标轴平行,左下角和右上角都在\(n\)个点之中,且内部不包含其它的点,则这个矩形是合法的。问给定的点中包含多少合法的矩形?

思路:

将点按照\(x\)排序,使用CDQ分治。分治的两边分别按照\(y\)排序,左右两遍分别维护一个单调栈。左边的单调栈按照\(x\)单调递减,右边的单调栈按照\(x\)单调递增。右边的栈中的点作为右上角,用树状数组维护左边的单调栈中的点,确定有多少点可以作为左下角。

时间复杂度\(\mathcal O(n\log^2n)\)。

源代码:

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<functional>
  6. inline int getint() {
  7. register char ch;
  8. while(!isdigit(ch=getchar()));
  9. register int x=ch^'0';
  10. while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
  11. return x;
  12. }
  13. typedef long long int64;
  14. const int N=2e5+1;
  15. int n;
  16. int64 ans;
  17. struct Node {
  18. int x,y;
  19. };
  20. Node a[N];
  21. inline bool cmp1(const Node &p1,const Node &p2) {
  22. if(p1.x==p2.x) {
  23. return p1.y<p2.y;
  24. }
  25. return p1.x<p2.x;
  26. }
  27. inline bool cmp2(const Node &p1,const Node &p2) {
  28. return p1.y<p2.y;
  29. }
  30. inline bool cmp3(const int &p1,const int &p2) {
  31. return a[p1].y>a[p2].y;
  32. }
  33. int s1[N],s2[N],t1,t2;
  34. class FenwickTree {
  35. private:
  36. int val[N];
  37. int lowbit(const int &x) const {
  38. return x&-x;
  39. }
  40. public:
  41. void modify(int p,const int &x) {
  42. for(;p<=n;p+=lowbit(p)) val[p]+=x;
  43. }
  44. int query(int p) const {
  45. int ret=0;
  46. for(;p;p-=lowbit(p)) ret+=val[p];
  47. return ret;
  48. }
  49. };
  50. FenwickTree t;
  51. void cdq(const int &b,const int &e) {
  52. if(b==e) return;
  53. const int mid=(b+e)>>1;
  54. cdq(b,mid);
  55. cdq(mid+1,e);
  56. int p=b,q=mid+1;
  57. for(;q<=e;q++) {
  58. while(t2!=0&&a[s2[t2]].x>a[q].x) t2--;
  59. for(;p<=mid&&a[p].y<a[q].y;p++) {
  60. while(t1!=0&&a[s1[t1]].x<a[p].x) {
  61. t.modify(a[s1[t1--]].y,-1);
  62. }
  63. t.modify(a[s1[++t1]=p].y,1);
  64. }
  65. ans+=t.query(a[q].y)-t.query(a[s2[t2]].y);
  66. s2[++t2]=q;
  67. }
  68. while(t1!=0) t.modify(a[s1[t1--]].y,-1);
  69. t2=0;
  70. std::inplace_merge(&a[b],&a[mid]+1,&a[e]+1,cmp2);
  71. }
  72. std::vector<int> v;
  73. int main() {
  74. n=getint();
  75. for(register int i=1;i<=n;i++) {
  76. a[i].x=getint();
  77. a[i].y=getint();
  78. }
  79. for(register int i=1;i<=n;i++) v.push_back(a[i].x);
  80. std::sort(v.begin(),v.end());
  81. for(register int i=1;i<=n;i++) {
  82. a[i].x=std::lower_bound(v.begin(),v.end(),a[i].x)-v.begin()+1;
  83. }
  84. v.clear();
  85. for(register int i=1;i<=n;i++) v.push_back(a[i].y);
  86. std::sort(v.begin(),v.end());
  87. for(register int i=1;i<=n;i++) {
  88. a[i].y=std::lower_bound(v.begin(),v.end(),a[i].y)-v.begin()+1;
  89. }
  90. v.clear();
  91. std::sort(&a[1],&a[n]+1,cmp1);
  92. cdq(1,n);
  93. printf("%lld\n",ans);
  94. return 0;
  95. }

[BZOJ4237]稻草人/[JOISC2014]かかし的更多相关文章

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

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

  2. BZOJ4237 稻草人 分治 单调栈

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

  3. [BZOJ4237]稻草人(CDQ分治)

    先按y排序,二分,两边递归下去,然后处理下半部分对上半部分的贡献,即左下点在下半部分,右上点在上半部分的合法矩形个数. 两个部分均按x排序,枚举右上点p,则左下点需要满足: 1.横坐标大于上半部分纵坐 ...

  4. BZOJ4237 稻草人 【CDQ分治】

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

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

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

  6. BZOJ4237稻草人——单调栈+CDQ分治

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

  7. bzoj4237稻草人

    题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数. 标程: #include<bits/stdc++.h> using namespace std; int ...

  8. bzoj4237 稻草人

    我是萌萌的传送门 题意不难理解吧-- 一开始看到这道题的时候lrd告诉我这题要分治,还给我讲了讲分治要怎么写,好像是CDQ+树状数组来着--(好吧我已经忘了--)然而我第一眼看完题之后的思路是数据结构 ...

  9. bzoj4237 稻草人——分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 分治: 先把所有点按 y 排序,然后二分递归: 对于每个 mid ,计算经过它的矩形的 ...

随机推荐

  1. win10定时关机

    CMD  输入shutdown -s -t 7200这个命令,大家可以自已设置7200这个时间,自己算一下60分钟=3600秒:

  2. 触发器Demo

    --mysql 触发器简单实例 --创建表1 )) ; --创建表2 )); --创建触发器,表一增加数据时,表二自动增加数据 create trigger t_afterinsert_on_tab1 ...

  3. mysql insert锁机制【转】

    最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...

  4. vue引入elementUI 报错

    在main.js里面引入import 'element-ui/lib/theme-default/index.css'中报错,无法启动项目,这是把package.json里面的webpack改成 1 ...

  5. 将python脚本转换成exe文件--pyinstaller

    遇到的大坑: 直接运行python文件效果:         执行 pyinstaller  -F -w  -p  -i ./123.ico  ./main.py    在dict文件夹下生成exe文 ...

  6. docker centos:last 开启sshd 遇到的证书问题

    启动sshd: # /usr/sbin/sshd 一.问题描述 这时报以下错误: [root@ xxx/]# /usr/sbin/sshd Could not load host key: /etc/ ...

  7. InnoDB锁问题

    InnoDB锁问题 InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.行级锁与表级锁本来就有许多不同之处,另外,事务的引入也带来了一些新问题.下面我 ...

  8. 3.Springboot之修改启动时的默认图案Banner

    一.SpringBoot的默认启动图案 在SpringBoot启动的时候,默认的会展示出一个spring的logo,这个图案我们用户是可以自定义的 二.自定义启动图案 方法一: Application ...

  9. Centos之关机和重启命令

    shutdown命令 shutdown [选项] 时间 -c:取消前一个关机命令 -h:关机 -r:重启 [root@localhost ~]# date 2017年 06月 21日 星期三 15:4 ...

  10. Python 的內建模块

    >>> import __builtin__>>> dir(__builtin__)['ArithmeticError', 'AssertionError', 'A ...