【BZOJ4237】稻草人
题意
给定平面上 \(N\) 个关键点,询问有多少个矩形满足左下和右上各有一个关键点,且矩形中间没有关键点。
\(N\le 2\cdot 10^5\) .
题解
我们按 \(x\) 排序分治,对于左右两边的区间按 \(y\) 排序。
考虑左边的点对右边的每个点产生的贡献。
比较容易发现,产生贡献的点的 \(x\) 一定单减,我们维护一个单调栈。
我们注意到,如果左边的点能和之前统计的右边的点形成矩形,那么这个点一定不会对当前点产生贡献。
那么做法就比较显然了:我们对于离当前点最近的横坐标比它小的点,在左边二分找纵坐标比该点小的点数,统计答案时减掉这部分点即可。
怎么找这样的点?我们对右边维护一个横坐标单增的单调栈即可。
时间复杂度 \(O(n\log ^2 n)\) ,代码非常好写。
#include<cstdio>
#include<algorithm>
using namespace std;
inline int gi()
{
char c; int x=0;
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
return x;
}
const int N=200005;
struct node {
int x,y;
} a[N],b[N];
bool operator < (node s, node t) {
return s.x<t.x;
}
bool cmp(node s, node t) {
return s.y<t.y;
}
int n,s1[N],s2[N];
long long ans;
int _bound(int w, int r)
{
int l=1;
while(l<=r)
{
int mid=l+r>>1;
a[s2[mid]].y<w?l=mid+1:r=mid-1;
}
return l-1;
}
void cdq(int l, int r)
{
if(l==r) return ;
int mid=l+r>>1;
cdq(l,mid),cdq(mid+1,r);
int t1=0,t2=0;
for(int i=mid+1,j=l;i<=r;++i)
{
for(;t1&&a[s1[t1]].x>a[i].x;--t1);
s1[++t1]=i;
for(;j<=mid&&a[j].y<a[i].y;++j)
{
for(;t2&&a[s2[t2]].x<a[j].x;--t2);
s2[++t2]=j;
}
ans+=t2-_bound(a[s1[t1-1]].y,t2);
}
merge(a+l,a+mid+1,a+mid+1,a+r+1,b,cmp);
for(int i=l,j=0;i<=r;++i,++j) a[i]=b[j];
}
int main()
{
n=gi();
for(int i=1;i<=n;++i) a[i].x=gi(),a[i].y=gi();
sort(a+1,a+1+n);
cdq(1,n);
printf("%lld",ans);
}
【BZOJ4237】稻草人的更多相关文章
- bzoj4237: 稻草人 cdq分治 单调栈
目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...
- [BZOJ4237]稻草人/[JOISC2014]かかし
[BZOJ4237]稻草人/[JOISC2014]かかし 题目大意: 平面上\(n(n\le2\times10^5)\)个点,若一个矩形各边与坐标轴平行,左下角和右上角都在\(n\)个点之中,且内部不 ...
- BZOJ4237 稻草人 分治 单调栈
原文链接https://www.cnblogs.com/zhouzhendong/p/8682572.html 题目传送门 - BZOJ4237 题意 平面上有$n(n\leq 2\times 10^ ...
- [BZOJ4237]稻草人(CDQ分治)
先按y排序,二分,两边递归下去,然后处理下半部分对上半部分的贡献,即左下点在下半部分,右上点在上半部分的合法矩形个数. 两个部分均按x排序,枚举右上点p,则左下点需要满足: 1.横坐标大于上半部分纵坐 ...
- BZOJ4237 稻草人 【CDQ分治】
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- BZOJ4237 稻草人(分治+树状数组+单调栈)
如果要询问的某个纵坐标为inf的点左边是否有点能与其构成所要求的矩形,只要用个单调栈就可以了.可以想到用分治来制造单调性. 按横坐标排序,每次考虑跨过分治中心的矩形.考虑右边的每个点能与左边的哪些点构 ...
- BZOJ4237稻草人——单调栈+CDQ分治
题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...
- bzoj4237稻草人
题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数. 标程: #include<bits/stdc++.h> using namespace std; int ...
- bzoj4237 稻草人
我是萌萌的传送门 题意不难理解吧-- 一开始看到这道题的时候lrd告诉我这题要分治,还给我讲了讲分治要怎么写,好像是CDQ+树状数组来着--(好吧我已经忘了--)然而我第一眼看完题之后的思路是数据结构 ...
- bzoj4237 稻草人——分治
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 分治: 先把所有点按 y 排序,然后二分递归: 对于每个 mid ,计算经过它的矩形的 ...
随机推荐
- Java程序与其它进程的数据通信
Java程序中可以启动其他的应用程序,这种在Java中启动的进程称为子进程,启动子进程的Java程序称为父进程,其实这个父进程就是一个Java虚拟机1.在Java程序中可以用Process类的实例对象 ...
- LibreOJ #2006. 「SCOI2015」小凸玩矩阵
想了挺久没想出来,一看题解恍然大悟.一个数对应一行和一列,二分答案,凡是小于等于答案的就连边.如果满足能够取出 \(n - k + 1\) 个不比二分中点 \(mid\) 大的数,那么r = mid, ...
- MyBatis模糊查询异常: '%${}''读取jdbc属性
'%${}''总是传root, 后来发现${username}读取了jdbc里面的属性username,于是将jdbc属性名修改,成功
- Xshell 5的快捷键
Xshell 5的快捷键 1. 点击下图中的按钮查看快捷键: 2. 快捷键备忘录: 序号 功能 快捷键 备注 1 在窗口和撰写栏之间切换 Alt+I 2 全屏 Alt+Enter 3 ...
- 搭建solr集群的时候出现 ./zkcli.sh:行13: unzip: 未找到命令
主要的原因是: linux系统下面没有安装压缩解压工具 zip 和 unzip:需要我们自己手动的安装: 利用yum命令安装即可: yum install -y unzip zip
- Samjia 和矩阵[loj6173](Hash+后缀数组)
传送门 本题要求本质不同的子矩阵,即位置不同也算相同(具体理解可以看样例自己yy). 我们先看自己会什么,我们会求一个字符串中不同的子串的个数.我们考虑把子矩阵变成一个字符串. 先枚举矩阵的宽度,记为 ...
- NO26 Linux的文件权限--chmod--Linux删除文件说明--suid--sgid
chmod命令改权限: suid: sgid:
- 连接mysql报错java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized...解决方法
报错内容: java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represents mo ...
- jackson处理json
原文连接 工具下载: jackson-core-2.2.3.jar 核心jar包,下载地址 jackson-annotations-2.2.3.jar 该包提供Json注解支持,下载地址 jackso ...
- Java提升三:函数式接口
1. 定义 函数式接口即是有且仅有一个抽象方法的接口. 注意: (1)函数式接口只对于抽象方法有要求,对于接口中的默认方法,静态方法,私有方法数量并不作特殊要求. (2)既然函数式接口定义了抽象方法, ...