bzoj 4237 稻 草 人
这个矩形有三个限制,分别是右上角点的横纵坐标分别大于左下角废话,并且中间区域没有点.那么可以先按横坐标排序,然后枚举左边的点和右边的点匹配.为了保证复杂度,这里每次把点集一分为二,先递归处理两边,然后处理两端点分别在左右两边的情况
这里把两边的点分别按纵坐标排序,然后枚举右边的点,每次把左边纵坐标小于右端点的点加进来.然后考虑中间区域没有点的限制,如果左边某个点在某个时刻右上方有点,那么这个点就不能作为端点.左侧可以维护一个从左往右纵坐标单调递减的单调栈.然后考虑右侧其他点对当前右端点的影响,如果有个点在右端点左下方,那么比那个点纵坐标小的左边的点就不能作为左端点.所以如果右边维护一个从左往右纵坐标单调递增的单调栈,那么就可以二分出那个左下的点,推出左端点的纵坐标最小是多少.再在左边单调栈二分出纵坐标最小的满足条件的左端点的位置,那么这个位置到栈顶之间的点都可以作为左端点
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define db double
using namespace std;
const int N=2e5+10;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct node
{
int x,y;
}a[N];
bool cmp1(node aa,node bb){return aa.x<bb.x;}
bool cmp2(node aa,node bb){return aa.y<bb.y;}
int n,st[N];
LL ans;
void cdq(int l,int r)
{
if(l==r) return;
int mid=(l+r)>>1;
cdq(l,mid),cdq(mid+1,r);
int tl=l-1,tr=mid;
sort(a+l,a+mid+1,cmp2);
sort(a+mid+1,a+r+1,cmp2);
for(int i=mid+1,j=l;i<=r;++i)
{
while(j<=mid&&a[j].y<a[i].y)
{
while(tl>=l&&a[st[tl]].x<a[j].x) --tl;
st[++tl]=j;
++j;
}
int ll=mid+1,rr=tr,z=0;
while(ll<=rr)
{
int md=(ll+rr)>>1;
if(a[st[md]].x<a[i].x) z=st[md],ll=md+1;
else rr=md-1;
}
int ql=l-1;
ll=l,rr=tl;
while(ll<=rr)
{
int md=(ll+rr)>>1;
if(a[st[md]].y<a[z].y) ql=md,ll=md+1;
else rr=md-1;
}
ans+=max(tl-ql,0);
while(tr>mid&&a[st[tr]].x>a[i].x) --tr;
st[++tr]=i;
}
}
int main()
{
n=rd();
for(int i=1;i<=n;++i) a[i].x=rd(),a[i].y=rd();
sort(a+1,a+n+1,cmp1);
cdq(1,n);
printf("%lld\n",ans);
return 0;
}
bzoj 4237 稻 草 人的更多相关文章
- bzoj 4237 稻草人 - CDQ分治 - 单调栈
题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...
- 【BZOJ】2055 80人环游世界
[算法]有源汇上下界最小费用可行流 [题解]上下界 因为上下界相同,所以无所谓最小流了,可行流(初始流+附加流)就是答案了. 记得源点向新建节点连一条容量为m(人)的边. bzoj 2055 80人环 ...
- BZOJ 1151 傲娇的人 排序
傲娇的人 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1151 Descrip ...
- ●BZOJ 4237 稻草人
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4237 题解: CDQ分治,单调栈 把所有点先按x从小到大排序,然后去CDQ分治y坐标. 在分 ...
- bzoj 4237: 稻草人 -- CDQ分治
4237: 稻草人 Time Limit: 40 Sec Memory Limit: 256 MB Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行 ...
- bzoj 4237稻草人
按x轴进行分治,将[l,r]分成[l,mid]和[mid+1,r],左下角点x值在[l,mid]中,右上角点x值在[mid+1,r],然后将[l,r]中的所有点按y轴排序,按顺序扫描,若扫描到左下角点 ...
- BZOJ 3406 乳草的入侵
BFS. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&g ...
- bzoj 4237: 稻草人
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- bzoj 4237 稻草人 CDQ
稻草人 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1433 Solved: 626[Submit][Status][Discuss] Descr ...
随机推荐
- LeetCode 23. 合并K个排序链表(Merge k Sorted Lists)
题目描述 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: ...
- System.Runtime.CompilerServices.Unsafe
System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime.CompilerServices.Un ...
- umount 报错was not found in /proc/mounts
前段时间在整理服务器时,看到nfs都是通过公网调用的,但是实际这几台服务器都是可以内网互通的,为了更稳定的使用,打算把这些挂载都更改为通过内网ip挂载,什么都设置好之后,操作第一台服务器没有问题,um ...
- WPF使用cefsharp 下载地址
源码下载: https://github.com/cefsharp/CefSharp dll类库包下载nuget: https://www.nuget.org/packages/CefSharp.Wp ...
- 六十五:CSRF攻击与防御之CSRF防御之form表单防御
防御原理,将csrf_token放到session中,再将session放到cookie中 实现: from flask_wtf import CSRFProtect # flask_wtf 已经提供 ...
- Pythonnumpy提取矩阵的某一行或某一列的实例
Python numpy 提取矩阵的某一行或某一列的实例 下面小编就为大家分享一篇Python numpy 提取矩阵的某一行或某一列的实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看 ...
- 利用Apache POI操作Excel
最近在做接口,有个功能是利用Excel导入汽车发动机所需零件信息到线上系统中.简单回顾一下之前学过的用java操作Excel. 1.maven配置Apache POI pom.xml中配置POIjar ...
- C#-WinForm跨线程修改UI界面
待解决的问题 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用. 因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程( ...
- JS apply 、call和bind
JS当中的call .apply.和bind 这三个方法都是js function当中自带的方法,用来改变this的指向. call()方法 语法格式: fun.call(thisArg[,arg1[ ...
- 基于OpenCV的三维数据点的曲面重构_MySurefaceReconstruction
在Opencv中有个Viz模块,可以显示三维物体,还可以实现三维动画,本来是很好的东东,但是里面的函数.类的说明太过简单,始终不得要领.不过其中一个扩展功能非常好,就是你可以在vtk中设计自己的模型类 ...