BZOJ4237 JOISC2014 稻草人 CDQ分治、单调栈
题意:给出平面上$N$个点,求满足以下两个条件的矩形:①左下角与右上角各有一个点;②矩形内部没有点。$N \leq 2 \times 10^5$,所有数字大于等于$0$,保证坐标两两不同
最开始想到的是类似于楼房重建的算法,然后打炸了qwq
在多维问题上考虑分治可以降低一维限制,很多时候都会用到(比如三维偏序)。
我们先对$y$值从小到大排序,在分治内部对$x$值从小到大排序,然后考虑左边一半对右边的贡献。
可以知道对于左边一半的两个点$a,b(a<b)$,如果$y_a<y_b$,那么$a$会被$b$阻挡,就不会对答案产生贡献。所以我们可以维护一个$y$值递减的单调栈来保存可能对当前询问的点产生贡献的左边的点的集合,每一次询问下一个点时,把$x$值小于它的其他点加入单调栈即可。
接下来我们考虑右边的点对右边产生的影响(右边的某一些点阻挡了某一些左边的点产生贡献)。发现我们同样可以维护一个$y$值递增的单调栈来保存对当前点有影响的点的集合。每一次我们就取出栈顶的点,在左边的点对应的集合上二分,就可以得到它使多少个左边的点不产生贡献了。
//This code is written by Itst
#include<bits/stdc++.h>
#define BZ
#define mid ((l + r) >> 1)
using namespace std;
inline int read(){
;
;
char c = getchar();
while(c != EOF && !isdigit(c)){
if(c == '-')
f = ;
c = getchar();
}
while(c != EOF && isdigit(c)){
a = (a << ) + (a << ) + (c ^ ');
c = getchar();
}
return f ? -a : a;
}
;
struct node{
int x , y;
}now[MAXN];
int N , hd , Stack[MAXN] , Stack2[MAXN] , top;
long long ans;
bool cmp1(node a , node b){
return a.y < b.y;
}
bool cmp2(node a , node b){
return a.x < b.x;
}
inline int bis(int x){
, R = hd;
while(L < R){
>> ;
now[Stack[m]].x < x ? L = m : R = m - ;
}
return L;
}
void solve(int l , int r){
if(l == r)
return;
solve(l , mid);
solve(mid + , r);
;
hd = top = ;
while(p2 <= r){
while(top && now[Stack2[top]].y > now[p2].y)
--top;
Stack2[++top] = p2;
while(p1 <= mid && now[p1].x < now[p2].x){
while(hd && now[Stack[hd]].y < now[p1].y)
--hd;
Stack[++hd] = p1++;
}
ans += hd - (top == ? : bis(now[Stack2[top - ]].x));
p2++;
}
sort(now + l , now + r + , cmp2);
}
int main(){
#ifdef BZ
freopen("4237.in" , "r" , stdin);
freopen("4237.out" , "w" , stdout);
#endif
N = read();
; i <= N ; i++){
now[i].x = read();
now[i].y = read();
}
sort(now + , now + N + , cmp1);
solve( , N);
cout << ans;
;
}
BZOJ4237 JOISC2014 稻草人 CDQ分治、单调栈的更多相关文章
- 【BZOJ4237】 稻草人 CDQ分治+单调栈
## 题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下 ...
- 【BZOJ4237】稻草人 cdq分治+单调栈+二分
[BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...
- bzoj4237: 稻草人 cdq分治 单调栈
目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...
- bzoj 4237 稻草人 - CDQ分治 - 单调栈
题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...
- [BZOJ4237]稻草人:CDQ分治+单调栈
分析 按\(y\)排序后CDQ分治,可以发现每个点可以影响的是\(x\)坐标的一段区间,可以使用扫描线+单调栈,在单调栈上二分即可解决,时间复杂度\(O(n \log^2 n)\). 通过归并排序可以 ...
- Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】
正题 题目链接:https://loj.ac/problem/2880 题目大意 给出平面上的\(n\)个点,然后求有多少个矩形满足 左下角和右上角各有一个点 矩形之间没有其他点 \(1\leq n\ ...
- 【bzoj4237】稻草人 分治+单调栈+二分
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- BZOJ4237 稻草人 分治 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^ ...
- 【BZOJ4237】稻草人 [分治][单调栈]
稻草人 Time Limit: 40 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description JOI村有一片荒地,上面竖着N个稻草 ...
随机推荐
- ionic 项目签名
一.ionic 自动签名的好处与坏处(ionic build android/ios) 好处在于:可以直接安装手机上进行安装测试,也可以上传Android或者iOS平台 不好的地方在于:你的电脑环境 ...
- ActiveReports公开课开启报名,学习如何解决中国式复杂报表难题
ActiveReports实战教学 90分钟解决中国式复杂报表六大需求 [开课时间]4月19日 [主讲老师]葡萄城资深报表专家 [培训方式]网络在线公开课 报名地址
- 安卓开发_浅谈ListView之分页列表
前言: 在开发的过程中,有时候我们需要从网络解析一些数据,比如最近的一些新闻,我们需要把这些数据用ListView显示出来. 因为是解析一个网络数据源,这样将会一下子将所有的数据解析出来,当数据源数据 ...
- Kotlin入门(19)Android的基础布局
线性布局线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右水平排列.排列顺序只能指定一维方 ...
- Microsoft .NET Core 1.0.0 VS 2015 Tooling Preview 2 Uninstall Failed
卸载过程中总是卸载失败报0x80070001:函数不明确错误.转遍了各大论坛和QQ,最终还是在stackoverflow上找到了答案... 原因是我卸载时选择的DotNetCore.1.0.0-VS2 ...
- 【HANA系列】SAP HANA XS使用JavaScript(JS)调用存储过程(Procedures)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...
- BootStrap DateTimePicker的使用
使用方法 1. 添加资源 2. 编写代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...
- exec 动态脚本 里面的参数和sp_executesql (注意引号,否则容易异常)
@indexCt int@DemographicName nvarchar(500)INSERT INTO #finalTemp EXEC('SELECT a.QuestionId,a.AnswerI ...
- oracle经验记录
1.添加新User时必须要增加的角色权限:connect.dba.resource 2.添加表空间的语句 create tablespace DEMOSPACE datafile 'D:/test.d ...
- IntelliJ IDEA 创建Spring项目
第一步:点击file --> new --> project... 第二步: 在左侧选择Spring, 然后勾选Spring , 最后点击Next 第三步 : 填写项目名称和项目地址,点击 ...