题目链接

Link

思路分析

题目要求我们统计二维平面内的点所构成的不含其他点的矩形个数,因此想到 cdqcdqcdq 分治。

我们先按照横坐标递增排序,这样就只用考虑左下角在 [l,mid][l,mid][l,mid] ,右上角在 [mid+1,r][mid+1,r][mid+1,r] 的矩形,在 [l,mid][l,mid][l,mid] 和 [mid+1,r][mid+1,r][mid+1,r] 内部的矩形可以递归处理。

然后考虑左集合 AAA 对右集合 BBB 的影响。枚举 AAA 中点 ppp 时,将B中 y[i]≥y[p]y[i] \ge y[p]y[i]≥y[p] 的点加入单调栈中,同时维护 x[i]x[i]x[i] 递增。

虽然 BBB 中的点不会出现在矩形内,但还要考虑A的影响,再用一个单调栈维护 AAA 中 x[i]x[i]x[i] 递减,用 ppp 点在 BBB 单调栈中二分即可。

注意二分细节较多,需仔细推敲边界及 midmidmid 的取值。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,ans;
int st1[N],st2[N],tp1,tp2;
struct node{int x,y;
}s[N];
bool cmp1(node a,node b){return a.x<b.x;}//x从小到大
bool cmp2(node a,node b){return a.y>b.y;}//y从大到小
int erfen(int p)
{int l=0,r=tp2;//二分栈中第0-tp2个元素while(l<r){int mid=(l+r+1)>>1;if(s[st2[mid]].y>p) l=mid;else r=mid-1;//不可能相等}return l;
}
void cdq(int l,int r)
{if(l==r) return;int mid=(l+r)>>1;cdq(l,mid);cdq(mid+1,r);sort(s+l,s+mid+1,cmp2);sort(s+mid+1,s+r+1,cmp2);    int j=mid+1;tp1=tp2=0;for(int i=l;i<=mid;i++){while(j<=r&&s[i].y<s[j].y){while(tp2&&s[st2[tp2]].x>s[j].x) tp2--;//维护x单增st2[++tp2]=j;j++;}while(tp1&&s[st1[tp1]].x<s[i].x) tp1--;//维护x单减ans+=tp2;if(tp1) ans-=erfen(s[st1[tp1]].y);//如果st1非空//这里不能换成lower_bound,因为我们是对结构体的其中一维二分st1[++tp1]=i;}
}
signed main()
{scanf("%lld",&n);for(int i=1;i<=n;i++) scanf("%lld%lld",&s[i].x,&s[i].y);sort(s+1,s+1+n,cmp1);cdq(1,n); printf("%lld\n",ans);return 0;
}

最后,友情附赠一组样例:

Input      Output
10         15
2 1
3 0
6 3
10 2
16 4
0 8
8 12
11 14
14 11
18 10

AT1225 稻草人(cdq分治+二分)相关推荐

  1. bzoj 4237: 稻草人 cdq分治

    求有多少个点对  其一个点为左下角  一个点为右下角所形成的矩形内部没有点 每个x与y都不同 一开始的思路: 先按照x坐标排序  进行cdq分治 然后在cdq内对y进行排序  枚举mid+1-r的点作 ...

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

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

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

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

  4. CDQ 分治与整体二分

    CDQ 分治与整体二分 CDQ 分治 主要是一种分治思想,常用于解决偏序问题. 例如三维偏序问题,我们采用的方法是先处理以第一关键字为区分的左区间.右区间内的答案,再处理左右区间互不干涉的答案. 四维 ...

  5. [CDQ分治与整体二分]个人对CDQ分治与整体二分的理解

    在线/离线:首要考虑 在线算法: 可以以序列化的方式一个一个的处理输入,不必事先知道所有输入数据 离线算法: 必须事先知道所有的输入数据 (例如选择排序就是一个离线算法,而插入排序则不是) 众所周知, ...

  6. [总结]CDQ分治整体二分

    从昨天到现在除了90%的颓废时间一直在研究一些分治的姿势,主要就是CDQ分治和整体二分. 首先推荐一些学习资料: 陈丹琦 <从 < Cash > 谈一类分治算法的应用> 许昊然 ...

  7. 【cdq分治】cdq分治与整体二分学习笔记Part2.cdq分治

    上午的学习学会了整体二分,下午学了cdq分治 发现了二者的区别: 整体二分的主体是在不断地二分答案(把所有询问二分),而cdq分治则是在不断地二分操作. 当然同样的,cdq分治的复杂度也是与区间长度正 ...

  8. 【cdq分治】cdq分治与整体二分学习笔记Part1.整体二分

    之所以把cdq分治和整体二分放在一起学习,是因为他们两个实在太像了-不管是做法还是代码- 感觉整体二分可能会比cdq分治稍微简单那么一点点?所以先学整体二分. 整体二分是对答案进行二分,其具体操作如下 ...

  9. 点分治+CDQ分治+整体二分全纪录

    点分治 点分治讲解 解决树上路径问题 经典例题:点分治(长度小于m的路径计数) 经典例题:点分治(聪聪可可) 经典例题:点分治(多个定值路径计数) 经典例题:点分治(采药) 经典例题:点分治+ST表+ ...

最新文章

  1. 【IBM Tivoli Identity Manager 学习文档】13 Service管理
  2. BZOJ 4814 Luogu P3699 [CQOI2017]小Q的草稿 (计算几何、扫描线、set)
  3. 计算机与操作系统小结
  4. 《深入浅出数据分析》样章下载
  5. python turtle库输出文字_python turtle库学习笔记
  6. GDG Xian: 假如我是一个浏览器
  7. 3Dslicer中 PET/CT 模块:PET Standard Uptake Value Computation
  8. 毕马威首次发布《初探元宇宙》报告:从科幻畅想到产业风口(附报告下载链接)...
  9. 解决方案-Visual Studio设置通用配置(包含路径+依赖库)
  10. 029——VUE中键盘语义修饰符
  11. Multisim14仿真使用汇总
  12. 【工作笔记】微信公众号页面摇一摇+触发音效
  13. 开源并“免费”的Linux平台DAW——Ardour 4.0发布
  14. 沙盘游戏让我变成“诗人”
  15. unity VR实现相机完美旋转
  16. Python薅羊毛脚本
  17. java-SpringBoot-oracle配置【自用】
  18. random模块——随机数常用函数介绍
  19. TIA Portal面向对象编程入门
  20. 计算机更改显卡,为你解答笔记本电脑怎么更换显卡

热门文章

  1. 怎么在微信客户端打开链接才会不提示已停止访问该网页
  2. float与double的精度问题
  3. php手册用法,php手册究竟是什么?如何对php手册进行使用?
  4. 慕课:软件测试各章节答案
  5. 如何在平凡的工作中提升自己的SEO营销优化力?
  6. Qt中文件读取的几种方式
  7. 使用ActiveMQ进行C++与C#的通信4 - 使用C++连接ActiveMQ
  8. python全景拼接
  9. 计算机考试客户端无法交卷,卓帆信息技术考试系统安装以后不能交卷,是什 – 手机爱问...
  10. 阿里云服务器性能测试方法(一条命令搞定)