洛谷传送门

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. 常见Python问题及解决办法

    文件编码问题 如果Python文件中存在中文注释,在运行时报错"SyntaxError: Non-ASCII character '\xe7' in file". 解决办法: 在文 ...

  2. Thinkpad T14 AMD版无线网卡不可用

    硬件环境: Thinkpad T14 AMD 操作系统: Windows 10家庭版 问题描述: Windows 10在后台默默做了补丁更新,导致无线网卡和蓝牙鼠标都不可用(但是有线网却是能正常工作的 ...

  3. 用Spring Security + JWT 来实现身份认证和用户授权

    https://mp.weixin.qq.com/s/FUYXAGlmt3HbwMoTygI4uQ

  4. 终端SSH远程连接CentOS报错:-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

    终端SSH远程连接CentOS时,报以下错误提示: -bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such ...

  5. C/C++、C#、JAVA(三):字符串操作

    C/C++.C#.JAVA(三):字符串操作 目录 C/C++.C#.JAVA(三):字符串操作 定义字符串 C C++ C# JAVA 捕捉输入和输出 等值比较 C/C++ C# JAVA 字符串操 ...

  6. 从实测出发,掌握 NebulaGraph Exchange 性能最大化的秘密

    自从开发完 NebulaGraph Exchange,混迹在各个 NebulaGraph 微信群的我经常会看到一类提问是:NebulaGraph Exchange 的性能如何?哪些参数调整下可以有更好 ...

  7. OPPO 自研大规模知识图谱及其在数智工程中的应用

    导读:OPPO 知识图谱是 OPPO 数智工程系统小布助手团队主导.多团队协作建设的自研大规模通用知识图谱,目前已达到数亿实体和数十亿三元组的规模,主要落地在小布助手知识问答.电商搜索等场景. 本文主 ...

  8. Python实现snap:对齐多张遥感影像的空间范围

      本文介绍基于Python中ArcPy模块,实现基于栅格图像批量裁剪栅格图像,同时对齐各个栅格图像的空间范围,统一其各自行数与列数的方法.   首先明确一下我们的需求.现有某一地区的多张栅格遥感影像 ...

  9. Codeforces Round 922 (Div. 2)(A~D)补题

    A题考虑贪心,要使使用的砖头越多,每块转的k应尽可能小,最小取2,最后可能多出来,多出来的就是最后一块k=3,我们一行内用到的砖头就是\(\frac{m}{2}\)下取整,然后乘以行数就是答案. #i ...

  10. Codeforces Round 638 (Div. 2)B. Phoenix and Beauty

    B. Phoenix and Beauty 这道题目学到的东西: 从给出的数据范围观察,得到一些有用信息(峰哥教的) 考虑无解的情况' 其实这题考虑怎么操作是比较难的,如果能想出来满足条件的结果就比较 ...