洛谷传送门

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部署项目为什么要用Nginx和uWSGI

    一.测试运行python项目 1.1 Flask项目 说明1:当我们直接用编译器运行Flask项目的时候,会有一个提示:意思就是:这是开发环境的服务器,不能用于生产环境的部署,请使用WSGI的服务器替 ...

  2. HashMap,TreeMap,LinkedHashMap的默认排序

    简单描述 Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,HashTable以及LinkedHashMap等. TreeMap:能够把它保存的记录根据键(key)排序,默 ...

  3. Volatile关键字原理

    转载请标明:https://www.cnblogs.com/tangZH/p/15113505.html 一.如果一个变量被volatile关键字修饰,那么所有线程都是可见的.所谓可见就是,当一条线程 ...

  4. Java 常用类 String的常用方法(2)

    1 /** 2 * String 常用方法(2) 3 * boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束 4 * boolean startsWith ...

  5. Java 小练习(2) 利用面向对象的编程方法 设计类Circle计算圆的面积

    1 package com.bytezero.exer; 2 /*** 3 * 4 * @Description 5 * @author Bytezero·zhenglei! Email:420498 ...

  6. 工具 --- IL指令集解释

    引言 汇总一下所有的 .NET IL 指令,以及它们的名称.操作码值.堆栈转换行为和描述. 作为反编译IL代码时的查询字典. IL 指令集列表 以下内容来自微软官方文档,通过百度翻译API翻译为中文. ...

  7. 快速带你入门css

    css复习笔记 1. css样式值 1.1 文字样式 1 p{ 2 font-size: 30px;/*设置文字大小*/ 3 font-weight: bold;/*文字加粗*/ 4 font-sty ...

  8. evalFn 字符串转执行函数 附带JSONParse函数

    const evalFn = (fn) => { var Fun = Function // 一个变量指向Function,防止前端编译工具报错 return new Fun('return ' ...

  9. 微信自动信息发送助手WMR

    某信自动信息发送助手WMR 最近放假闲来无事,捣鼓了一下pyqt5,正好手上有每天定时大量群发消息的需求,正好就用pyqt5做个小应用练练手. 包含到的主要库:pyqt5.pyperclip.pyau ...

  10. Sub-process /usr/bin/dpkg returned an error code (1)问题

    在用apt-get安装软件包的时候遇到E: Sub-process /usr/bin/dpkg returned an error code (1)问题,解决方法如下: cd /var/lib/dpk ...