洛谷传送门

BZOJ 4237 稻草人


题意

在一个平面直角坐标系上给出\(n\)个点,

问有多少个点对\((i,j)\)满足\(x_i<x_j,y_i<y_j\),

而且对于\(n\)个点中的任意一点都不在以点\(i\)为左下角,

点\(j\)为右上角的矩形内部(不包括边界)


分析

如果没有下面的限制应该是一道二维偏序裸题,但是限制不好搞

考虑用CDQ分治,也就是倘若\([l\sim mid]\)和\([mid+1\sim r]\)的答案已经弄好,处理区间不同的情况

假设一开始以纵坐标升序排序,

处理完一个区间该区间就以横坐标升序排序,

那也就是能保证\([l\sim mid]\)的\(y\),

均不超过\([mid+1\sim r]\)的\(y\),

区间内部的\(x\)单调不降

枚举右上角的\(j\),左下角可以用双指针,

那就可以确定一段左下角区间,因为区间内部\(x\)单调不降,

所以\([l\sim mid]\)的\(y\)单调不升才能不互相影响,

显然可以用单调栈维护;

那怎样判断右上角有没有影响,

只要查找到\(i\)左边第一个比它纵坐标小的点\(k\)就可以了,

显然还是可以用单调栈

然后左下角单调栈可选择的范围就是\(x_k\leq x_t\leq x_i\)

可以用二分来求,时间复杂度\(O(nlog^2n)\)

注意AT1225 かかし答案需要换行 (我就说我怎么WA了)

还是手画一张图好理解上面的抽象描述


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=200011;
int st2[N],st1[N],n;
long long ans;
struct rec{int x,y;}a[N],b[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
bool cmp(rec x,rec y){return x.y<y.y;}
inline signed divid(int l,int r,int z){//二分<z的最大值
while (l<r){
rr int mid=(l+r+1)>>1;
if (a[st2[mid]].x<z) l=mid;
else r=mid-1;
}
return l;
}
inline void cdq(int l,int r){
if (l==r) return;
rr int mid=(l+r)>>1,T1=0,T2=0;
cdq(l,mid),cdq(mid+1,r);
for (rr int i=mid+1,j=l;i<=r;++i){
while (T1&&a[i].y<a[st1[T1]].y) --T1;//右上角单调不降
st1[++T1]=i;
for (;a[j].x<a[i].x&&j<=mid;++j){
while (T2&&a[j].y>a[st2[T2]].y) --T2;//左下角单调不升
st2[++T2]=j;
}
if (a[st2[T2]].x>=a[st1[T1-1]].x)
ans+=T2-divid(0,T2,a[st1[T1-1]].x);
}
rr int i1=l,j1=mid+1,T=0;
//归并排序模板
while (i1<=mid&&j1<=r)
if (a[i1].x<=a[j1].x) b[++T]=a[i1],++i1;
else b[++T]=a[j1],++j1;
while (i1<=mid) b[++T]=a[i1],++i1;
while (j1<=r) b[++T]=a[j1],++j1;
for (rr int i=1;i<=T;++i) a[l+i-1]=b[i];
}
signed main(){
n=iut();
for (rr int i=1;i<=n;++i)
a[i]=(rec){iut(),iut()};
sort(a+1,a+1+n,cmp),cdq(1,n);
return !printf("%lld\n",ans);
}

#CDQ分治,单调栈,双指针#BZOJ 4237 稻草人 AT1225 かかし的更多相关文章

  1. 【BZOJ4237】 稻草人 CDQ分治+单调栈

    ## 题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下 ...

  2. bzoj 4237 稻草人 - CDQ分治 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...

  3. bzoj4237: 稻草人 cdq分治 单调栈

    目录 题目链接 题解 代码 题目链接 bzoj4237: 稻草人 题解 暴力统计是n^2的 考虑统计一段区间对另一端的贡献 对于y值cdq分治,降调一维 对于当前两个分治区间统计上面那部分对下面那部分 ...

  4. 【BZOJ4237】稻草人 cdq分治+单调栈+二分

    [BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...

  5. [BZOJ4237]稻草人:CDQ分治+单调栈

    分析 按\(y\)排序后CDQ分治,可以发现每个点可以影响的是\(x\)坐标的一段区间,可以使用扫描线+单调栈,在单调栈上二分即可解决,时间复杂度\(O(n \log^2 n)\). 通过归并排序可以 ...

  6. Loj#2880-「JOISC 2014 Day3」稻草人【CDQ分治,单调栈,二分】

    正题 题目链接:https://loj.ac/problem/2880 题目大意 给出平面上的\(n\)个点,然后求有多少个矩形满足 左下角和右上角各有一个点 矩形之间没有其他点 \(1\leq n\ ...

  7. 【bzoj4237】稻草人 分治+单调栈+二分

    题目描述 JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要满足以下条件: ...

  8. BZOJ_1307_玩具_单调栈+双指针

    BZOJ_1307_玩具_单调栈+双指针 Description 小球球是个可爱的孩子,他喜欢玩具,另外小球球有个大大的柜子,里面放满了玩具,由于柜子太高了,每天小球球都会让妈妈从柜子上拿一些玩具放在 ...

  9. bzoj 4237: 稻草人 -- CDQ分治

    4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行 ...

  10. 【BZOJ4237】稻草人 [分治][单调栈]

    稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description JOI村有一片荒地,上面竖着N个稻草 ...

随机推荐

  1. 用Taro写一个微信小程序——引入外部字体

    小程序直接用.ttf字体文件,在开发工具看没有问题,但是打包编译会提示这个字体文件打包上传不成功. 一.字体文件转换为css 1.打开https://transfonter.org/ 注意选择Base ...

  2. django中使用celery异步发送邮件

    申请163网易发送邮件权限 在django中settings配置文件 #配置邮件服务器 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBac ...

  3. Vue 上传前获取图片宽度尺寸和大小

    参考资料:https://www.cnblogs.com/wyx-remove-love/p/wyx-20190626-1.html    https://blog.csdn.net/qq_22771 ...

  4. 记录一个错误:Unable to find a match: python-dev

    今天尝试在Linux下运行一个Python项目,在安装requirements.txt时报错 执行命令如下: [root@VM-16-8-centos cve-search]# pip3 instal ...

  5. Jina AI x 矩池云Matpool |神经搜索引擎,一键构建

    图片.视频.语音等非结构化数据在快速增长,随着深度学习技术的不断升级,非结构化数据的搜索也逐渐形成可能.在这样的背景下,专注于神经搜索技术的商业开源软件公司--Jina AI,提出了神经搜索 (Neu ...

  6. 第124篇: 期约Promise基本方法

    好家伙,本篇为<JS高级程序设计>第十章"期约与异步函数"学习笔记   1.异步编程 同步行为和异步行为的对立统一是计算机科学的一个基本概念. 特别是在 JavaScr ...

  7. 【Azure 应用服务】Azure Function 不能被触发

    问题描述 Azure Function 不能被Postman 触发,错误信息如下: Error: write EPROTO 4020778632:error:100000f7:SSL routines ...

  8. PHP项目&RCE安全&调试&追踪&代码执行&命令执行

    常见漏洞关键字 SQL注入:select.insert.update.mysql_query.mysqli等 文件上传:$_FILES.type="file".上传.move_up ...

  9. Alertmanager钉钉告警

    一.部署alertmanager 1.1 创建目录 mkdir -p /deploy/app/alertmanager/config chmod -R 777 /deploy/app/alertman ...

  10. Redis集群Cluster

    Redis Cluster 是社区版推出的 Redis 分布式集群解决方案,主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好 ...