求有多少个点对  其一个点为左下角  一个点为右下角所形成的矩形内部没有点 每个x与y都不同

一开始的思路:

先按照x坐标排序  进行cdq分治

然后在cdq内对y进行排序  枚举mid+1-r的点作为右上角的点

发现只要维护左半边的的单调递增就可以形成点对  用单调栈很好的维护

但是忽略了右半边已经遍历过的点对答案产生的影响

参考了yyb巨佬:https://www.cnblogs.com/cjyyb/p/8419102.ht

想一下新增点的x左边可以发现影响关系

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
#define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
#define inf 0x3f3f3f3f
#define CLR(A,v)  memset(A,v,sizeof A)
/
const int N=1e6+10;
//维护单调递减的单调栈
int n,m;ll ans[N];ll sum;
struct node{int x,y,id;}s[N];
bool cmp(node a,node b){return a.y>b.y;}
bool cmpx(node a,node b){return a.x<b.x;}
int sta1[N],top1,sta2[N],top2;void cdq(int l,int r)
{if(l==r)return ;int mid=(l+r)>>1;cdq(l,mid);cdq(mid+1,r);int j=mid+1;sort(s+l,s+mid+1,cmp);sort(s+mid+1,s+r+1,cmp);int top1=top2=0;rep(i,l,mid){while(j<=r&&s[i].y<s[j].y){while(top1>0&&s[sta1[top1]].x>s[j].x)top1--;sta1[++top1]=j++;}while(top2>0&&s[sta2[top2]].x<s[i].x)top2--;sta2[++top2]=i;if(top2==1)sum+=1ll*top1;else {int L=1,R=top1,an=top1+1;while(L<=R){int mid=(L+R)>>1;if(s[sta1[mid]].y>s[sta2[top2-1]].y)L=mid+1;else an=mid,R=mid-1;}sum+=1ll*top1-an+1;}}
}
int main()
{cin>>n;rep(i,1,n){scanf("%d%d",&s[i].x,&s[i].y);s[i].id=i;}sort(s+1,s+1+n,cmpx);cdq(1,n);cout<<sum;return 0;
}

View Code

转载于:https://www.cnblogs.com/bxd123/p/11469329.html

bzoj 4237: 稻草人 cdq分治相关推荐

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

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

  2. BZOJ#4237. 稻草人

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

  3. bzoj 4237: 稻草人

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

  4. ●BZOJ 4237 稻草人

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4237 题解: CDQ分治,单调栈 把所有点先按x从小到大排序,然后去CDQ分治y坐标. 在分 ...

  5. BZOJ 4285 使者 (CDQ分治+dfs序)

    题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...

  6. bzoj 4237 稻草人

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 CDQ.然而却不会做. **分治的话,只要考虑两部分之间对答案的贡献就行了,不用考虑部 ...

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

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

  8. AT1225 稻草人(cdq分治+二分)

    题目链接 Link 思路分析 题目要求我们统计二维平面内的点所构成的不含其他点的矩形个数,因此想到 cdqcdqcdq 分治. 我们先按照横坐标递增排序,这样就只用考虑左下角在 [l,mid][l,m ...

  9. bzoj 1176 Mokia (cdq分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 3874  Solved: 1742 [Submit] ...

最新文章

  1. Nature:肠道菌群代谢物调节肠道与免疫
  2. hdu3786 Floyd或搜索 水题
  3. Java技术小册(基础篇)
  4. MAC 下用GCC编译报错:“Undefined symbols for architecture x86_64: ”
  5. 使用beanShell来解析执行java的String方法,类似javascipt的eval方法
  6. 渗透测试专业术语——攻击篇
  7. android 设置组件背景图片,Android TextView背景颜色与背景图片设置
  8. 中国工商银行计算机专业笔试内容,中国工商银行的笔试一般考什么内容?
  9. 51单片机c语言程序执行顺序,51单片机程序执行流程详细分析
  10. python太阳代码_Python模拟太阳
  11. JS的组成-JS数组方法-JS函数-系统化学习
  12. Ubuntu下硬件信息的查看方式
  13. LeetCode 2315. 统计星号
  14. 前端开发者的专业度自查 100 条
  15. FHQ Treap 总结
  16. 一道简单的Python面试题,却涵盖诸多考点,快来试试吧!
  17. 弄底层基础的东西往往慢,枯燥,要慢慢磨
  18. 【Kelm分类】基于哈里斯鹰算法优化核极限学习机实现数据分类附matlab代码
  19. Initialization of bean failed; nested exception is java.lang.reflect.MalformedParameterizedTypeExce
  20. COM劫持 BypassUAC

热门文章

  1. 按分类分割EXCEL文件
  2. github免费搭建个人博客
  3. Hackbar旧版安装教程
  4. linux yum卸载与安装软件包,Linux yum命令详解(查询、安装、升级和卸载软件包)...
  5. Cloudreve云盘系统源码,支持本地储存和对接各大对象储存,界面美观
  6. 通过DHCP获取IP地址,使相关PC可以互相访问
  7. c# 整数除法取整_c# 三种取整方法 向上取整 向下取整 四舍五入
  8. INT202 算法复杂度 笔记
  9. 李宁网易体育-网易网站
  10. 检查宿舍卫生( 结构体 ) SDUT C语言