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 ,计算经过它的矩形的 ...
随机推荐
- 所有ORM操作 (第二版)
####################################################################### # PUBLIC METHODS THAT ALTER ...
- importlib模块
importlib模块 import importlib根据这个字符串来导入这个模块的 a=importlib.import_module('xx.oo')print(a.Person())里面可以传 ...
- mysql针对单个库进行备份
#!/bin/bashBakDir=/backup/mysql_backupLogFile=/backup/mysql_backup.logDate=`date +%Y%m%d`Begin=`date ...
- BeautifulSoup解析器的选择
BeautifulSoup解析器 在我们使用BeautifulSoup的时候,选择怎样的解析器是至关重要的.使用不同的解析器有可能会出现不同的结果! 今天遇到一个坑,在解析某html的时候.使用htm ...
- Codeforces 1114F Please, another Queries on Array? [线段树,欧拉函数]
Codeforces 洛谷:咕咕咕 CF少有的大数据结构题. 思路 考虑一些欧拉函数的性质: \[ \varphi(p)=p-1\\ \varphi(p^k)=p^{k-1}\times (p-1)= ...
- CSS弹性(flexible)盒子
弹性盒子 弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成 弹性容器通过display:flex | inline-flex将其定义为弹性容器 ...
- chkconfig: command not found
问题描述 Ubuntu 16.04 下安装 Nginx 服务器,在添加 nginx 服务时出现如下信息 # chkconfig --add nginx chkconfig: command not f ...
- Bootstrap补充
一.一个小知识点 1.截取长屏的操作 2.设置默认格式 3.md,sm, xs 4.空格和没有空格的选择器 二.响应式介绍 - 响应式布局是什么? 同一个网页在不同的终端上呈现不同的布局等 - 响应式 ...
- 单击列表行前边的checkbox被选中,再单击,取消选中
需求描述:单击datatabl的一行数据,前边的checkbox被勾选上,再次点击,选中取消,第一次碰到这种需求,不过呢也很实用,简单记录一下 代码: //html代码<tr class=&qu ...
- mysql 修改配置文件my.cnf失败
一.连接Mysql提示无法通过socket的解决方法连接到本地MySQL服务器 http://www.aiezu.com/db/mysql_cant_connect_through_socket.ht ...