BZOJ4237 稻草人 分治 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html
题目传送门 - BZOJ4237
题意
平面上有$n(n\leq 2\times 10^5)$个整点(坐标范围在$[0,10^9]$之间)。
第$i$个点$p_i$的坐标是$(x_i,y_i)$。
如果有一对点$p_i$和$p_j$,满足$x_i<x_j,y_i<y_j$,而且以这两个点为左下角和右上角所围城的矩形内不包含任何整点(边界上面不算),那么他们对答案的贡献为1。
求答案。
题解
对于$x$坐标分治,然后单调栈解决跨越中线两端的点的贡献即可。
好像听好写的,不详细介绍了。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=200005;
struct Point{
int x,y;
void get(){
scanf("%d%d",&x,&y);
}
}p[N],q[N];
int n,Lstack[N],Rstack[N],Ltop,Rtop;
LL ans=0;
bool cmpx(Point a,Point b){
return a.x<b.x;
}
void solve(int xL,int xR,int L,int R){
if (L>=R)
return;
int xmid=(xL+xR)>>1,mid=R;
while (mid>=L&&p[mid].x>xmid)
mid--;
solve(xL,xmid,L,mid);
solve(xmid+1,xR,mid+1,R);
Ltop=Rtop=0;
Lstack[0]=Rstack[0]=0;
q[0].y=-1;
for (int i=L,l=L,r=mid+1;i<=R;i++)
if (r>R||(l<=mid&&p[l].y<=p[r].y)){
q[i]=p[l++];
while (Ltop>0&&q[Lstack[Ltop]].x<q[i].x)
Ltop--;
Lstack[++Ltop]=i;
/* int pos=Ltop,y;
for (int j=1<<18;j>0;j>>=1)
if (pos-j>0&&q[Lstack[pos-j]].x==q[i].x)
pos-=j;
y=q[Lstack[pos-1]].y+1;
pos=Rtop+1;
for (int j=1<<18;j>0;j>>=1)
if (pos-j>0&&q[Rstack[pos-j]].y>=y)
pos-=j;
ans+=Rtop-pos+1;*/
}
else {
q[i]=p[r++];
while (Rtop>0&&q[Rstack[Rtop]].x>q[i].x)
Rtop--;
Rstack[++Rtop]=i;
int pos=Rtop,y;
for (int j=1<<18;j>0;j>>=1)
if (pos-j>0&&q[Rstack[pos-j]].x==q[i].x)
pos-=j;
y=q[Rstack[pos-1]].y+1;
pos=Ltop+1;
for (int j=1<<18;j>0;j>>=1)
if (pos-j>0&&q[Lstack[pos-j]].y>=y)
pos-=j;
ans+=Ltop-pos+1;
}
for (int i=L;i<=R;i++)
p[i]=q[i];
}
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
p[i].get();
sort(p+1,p+n+1,cmpx);
solve(0,1e9,1,n);
printf("%lld\n",ans);
return 0;
}
BZOJ4237 稻草人 分治 单调栈的更多相关文章
- 【bzoj4237】稻草人 分治+单调栈+二分
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- 【BZOJ4237】稻草人 [分治][单调栈]
稻草人 Time Limit: 40 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description JOI村有一片荒地,上面竖着N个稻草 ...
- 【BZOJ4237】 稻草人 CDQ分治+单调栈
## 题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下 ...
- bzoj4237: 稻草人 cdq分治 单调栈
目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...
- 【BZOJ4237】稻草人 cdq分治+单调栈+二分
[BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...
- [BZOJ4237]稻草人:CDQ分治+单调栈
分析 按\(y\)排序后CDQ分治,可以发现每个点可以影响的是\(x\)坐标的一段区间,可以使用扫描线+单调栈,在单调栈上二分即可解决,时间复杂度\(O(n \log^2 n)\). 通过归并排序可以 ...
- bzoj 4237 稻草人 - CDQ分治 - 单调栈
题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...
- Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】
正题 题目链接:https://loj.ac/problem/2880 题目大意 给出平面上的\(n\)个点,然后求有多少个矩形满足 左下角和右上角各有一个点 矩形之间没有其他点 \(1\leq n\ ...
- bzoj4237 稻草人——分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 分治: 先把所有点按 y 排序,然后二分递归: 对于每个 mid ,计算经过它的矩形的 ...
随机推荐
- 机器学习之高斯混合模型及EM算法
第一部分: 这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类 ...
- ionic3 极光推送
参考网站:http://www.jianshu.com/p/eb8ab29329d9 遇到的问题是 执行以下命令一直报错 cordova plugin add https://github.com/ ...
- 最短路径之Bellman-Ford算法
第一行为源点个数,边的个数m 接下来m行为a->b和权值 5 52 3 21 2 -31 5 54 5 23 4 3 Bellman-Ford算法(1): #include<iostrea ...
- jsp 运行时报错Cannot find a method to write property [firstName] of type [java.lang.String] in a bean of type [main.Employee]
原因: 代码没有安装bean的格式写 setFirstName写成了setFristName 错误代码 public void setFristName(String firstName) { thi ...
- 关系代数和sql语句对应关系
关系代数运算符 对应sql语句 聚合操作 ∪ (UNION)并 ∩ (INTERSECTION)交 - (DIFFERENCE)差 × (Cartesian PRODUCT)笛卡尔积 ...
- Pychram 在model中修改class属性值后更新到Navicat Premium中
一.pycharm数据更新的问题bug问题 1.在更改user_email字端属性后出现数据库信息无法更新到数据库,出现的bug原因是数据库修改了属性之后没有做migrate 和 makemigrat ...
- js中json对象数组按对象属性排序---1
转载:https://www.cnblogs.com/jasonwang2y60/p/6656103.html 在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据js ...
- Python继承、方法重写
继承 在编写类时,并不是每次都要从空白开始.当要编写的类和另一个已经存在的类之间存在一定的继承关系时,就可以通过继承来达到代码重用的目的,提高开发效率. class one(): "&quo ...
- Python老男孩
1.可以自己编写模块,但注意:如果想要调用该模块,需要将该模块放到site-packages目录下,或将该模块放在执行程序的路径下. 2.pyc文件是什么? 集合: set 集合可以去重:做交集.并集 ...
- ajax-简单参数方法实现阴影效果
注: 简单参数 (按照参数的数量和位置传递参数) 使用时按照位置.数量传递 shadow.js函数 //简单参数实现方式/** slices:阴影* opacity:透明度* zIndex:层级* * ...