题意

给定平面上 \(N\) 个关键点,询问有多少个矩形满足左下和右上各有一个关键点,且矩形中间没有关键点。

\(N\le 2\cdot 10^5\) .

题解

我们按 \(x\) 排序分治,对于左右两边的区间按 \(y\) 排序。

考虑左边的点对右边的每个点产生的贡献。

比较容易发现,产生贡献的点的 \(x\) 一定单减,我们维护一个单调栈。

我们注意到,如果左边的点能和之前统计的右边的点形成矩形,那么这个点一定不会对当前点产生贡献。

那么做法就比较显然了:我们对于离当前点最近的横坐标比它小的点,在左边二分找纵坐标比该点小的点数,统计答案时减掉这部分点即可。

怎么找这样的点?我们对右边维护一个横坐标单增的单调栈即可。

时间复杂度 \(O(n\log ^2 n)\) ,代码非常好写。

#include<cstdio>
#include<algorithm>
using namespace std;
inline int gi()
{char c; int x=0;for(;c<'0'||c>'9';c=getchar());for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';return x;
}
const int N=200005;
struct node {int x,y;
} a[N],b[N];
bool operator < (node s, node t) {return s.x<t.x;
}
bool cmp(node s, node t) {return s.y<t.y;
}
int n,s1[N],s2[N];
long long ans;
int _bound(int w, int r)
{int l=1;while(l<=r){int mid=l+r>>1;a[s2[mid]].y<w?l=mid+1:r=mid-1;}return l-1;
}
void cdq(int l, int r)
{if(l==r) return ;int mid=l+r>>1;cdq(l,mid),cdq(mid+1,r);int t1=0,t2=0;for(int i=mid+1,j=l;i<=r;++i){for(;t1&&a[s1[t1]].x>a[i].x;--t1);s1[++t1]=i;for(;j<=mid&&a[j].y<a[i].y;++j){for(;t2&&a[s2[t2]].x<a[j].x;--t2);s2[++t2]=j;}ans+=t2-_bound(a[s1[t1-1]].y,t2);}merge(a+l,a+mid+1,a+mid+1,a+r+1,b,cmp);for(int i=l,j=0;i<=r;++i,++j) a[i]=b[j];
}
int main()
{n=gi();for(int i=1;i<=n;++i) a[i].x=gi(),a[i].y=gi();sort(a+1,a+1+n);cdq(1,n);printf("%lld",ans);
}

转载于:https://www.cnblogs.com/farway17/p/10747572.html

【BZOJ4237】稻草人相关推荐

  1. bzoj4237稻草人

    传送门 写了一中午,被自己瓜得无话可说. cdq的题,然后开始脑补. 写了第一个版本是考虑一半对另一半的贡献,贡献的那一遍维护单调性,没有考虑查询的一半的点之间的影响,一直偏大,14pt. 卡掉的数据 ...

  2. Stargazer的分治讲义

    cyk的分治讲义 文章目录 分治讲义 一.一般分治 1.序列分治 2.整体二分 3.CDQ分治 前置 引入 进入正题 4.二进制分组 5.线段树分治 二.树上分治 6.点分治 关于操作树上点分(论文) ...

  3. BZOJ4237 JOISC2014 稻草人 CDQ分治、单调栈

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

  4. Bzoj4237:稻草人

    题面 传送门 Sol CDQ  C D Q CDQ分治 先对 x  x x排序,对y'>y yy在 CDQ  C D Q CDQ分治是从大到小排序 从大到小加入,右边用单调栈维护 x  x x递 ...

  5. PHP企业网站源码-稻草人PHP系统源码v1.0.3

    简介: 稻草人PHP系统是一个致力于业务系统的快速开发及快捷建立的PHP企业网站源码. 安装步骤: 下载源码解压后,Web服务器配置根目录为public 安装系统如下: 安装路径是:host/inst ...

  6. bzoj 4237: 稻草人(CDQ分治+单调栈+二分)

    4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1352  Solved: 594 [Submit][Status][Discus ...

  7. 小程序稻草人图床神器,前后端开源

    文章目录 稻草人图床神器 小程序 后台: 小程序详解 项目结构 开屏页 1.判断网络状态 2.判断授权状态 3.跳转页面 授权页 主页 1. 图片按钮插槽组件 2. 上传文件 列表页 1.search ...

  8. 稻草人项目--项目前期准备

    目录 稻草人项目: 稻草人项目流程演示: 稻草人项目功能实现组件及工作原理: 创建数据库表格及表字段名称: 1. 项目前期准备--学习创建Maven聚合项目 1.1. 创建聚合项目 1.2. 通过父项 ...

  9. 稻草人项目--( day04 )

    目录 稻草人项目 8. 在SpringMVC框架中统一处理异常 关于统一处理异常的方法: 9. 请求参数验证 10.注册前端页面测试 11.注册成功后的收尾工作 12. 阶段小结 稻草人项目 8. 在 ...

最新文章

  1. 自动化测试基础篇--Selenium框架设计(POM)
  2. 我的博客博客之路....
  3. 人生苦短,我用Python
  4. Ceph:RBD在线扩容容量
  5. SAP HANA要改变什么?
  6. git diff命令详解
  7. linux内核设计与实现---从内核出发
  8. VC++的windows服务
  9. python字符串处理函数汇总_python字符串函数总结
  10. 图论 —— 生成树 —— 次小生成树
  11. python有哪些软件包用来考察变量之间的相关性_Python语言基础考察点:python语言基础常见考题(一)...
  12. java写算法之二叉搜索树查找
  13. 自学JAVA-2:数据类型与运算符
  14. Java基础,不需要复杂语句,使用for循环实现求出1~100之间的奇数和以及偶数和,超级简单
  15. 机器学习算法之SVM的多分类
  16. Java集合框架篇-64-TreeSet集合练习题2
  17. moment获取几小时前_moment.js 常用(几天前、相差几天、自然周、自然月)
  18. 干货|2021年以后人工智能的几点思考?
  19. Centos7操作系统搭建Snipe-IT资产管理系统
  20. loadrunner 操作mysql_loadrunner学习笔记(从MYSQL中取数据)

热门文章

  1. 阿里云智能物联网解决方案宣讲会,帮助天津东丽临空经济区数字腾飞
  2. 阿里中间件再获高度肯定,“三位一体”推动技术普惠
  3. 云效DevOps实践-代码评审
  4. 蚂蚁王旭:开源协作如何提升业界的安全?
  5. Java经典面试题整理及答案详解(二)
  6. 如何快速上手 AB Testing ?阿里技术专家秘方公开
  7. PMP每日三题2022年2月11日
  8. golden gate 错误集锦
  9. 更改Tomcat虚拟内存大小
  10. 有关 Oracle redo log