原文链接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 稻草人 分治 单调栈的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. bzoj4237 稻草人——分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 分治: 先把所有点按 y 排序,然后二分递归: 对于每个 mid ,计算经过它的矩形的 ...

随机推荐

  1. windows下安装Rabbitmq详解

    RabbitMQ是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang. 1.什么是Erlang? Erlang(['ə:læŋ])是一种通用的面向并发的编程语言 ...

  2. Java的家庭记账本程序(E)

    日期:2019.2.9 博客期:032 星期二 今天是把程序的相关Bug补一补,嗯`: 1.添加了跳转说明 生成了一个对于成员的权限声明内容,用户再登陆界面点击Go按钮后,切换至说明页面,再次点击Go ...

  3. Ribbon服务消费者

    springcloud使用到两种消费工具,ribbon和feign ribbon实现了服务的负载均衡 feign默认集成了ribbon,一般情况下使用feign作为消费端 搭建消费者项目(Ribbon ...

  4. Laravel 项目中编写第一个 Vue 组件

    和 CSS 框架一样,Laravel 不强制你使用什么 JavaScript 客户端框架,但是开箱对 Vue.js 提供了良好的支持,如果你更熟悉 React 的话,也可以将默认的脚手架代码替换成 R ...

  5. java----微服务架构

    参考文档 https://topsale.gitbooks.io/java-cloud-dubbo/content/ 单体应用: 项目的架构完完全全属于传统的 MVC 架构,所有的子系统都集成在一个很 ...

  6. 使用Eclipse、Tomcat遇到的一些问题

    Tomcat服务无法启动 前两天瞎搞,试着弄了弄Android的环境.结果不知道动了什么地方,Tomcat崩了,本地打开localhost:8080一直显示404,eclipse也无法使用Tomcat ...

  7. easyui合并多个单元格

    $('#table-v2').datagrid({ url: './data/am/data1_table.json', pagination: true, //显示分页 fit: true, //d ...

  8. 沈阳润才教育CRM

    一.CRM初始 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...

  9. lisp : set 与setq 函数

    在Lisp中,如果我们希望对一个变量赋值,可以使用set函数,用法如下: (set ‘my-value "my string") 上面的代码是对变量my-value进行赋值,值是& ...

  10. Oracle logminer 日志挖掘

    Table of Contents 1. LOGMNR简介 2. 创建数据字典 2.1. 外部文件存储数据字典 2.2. redo log 存储数据字典 3. 添加需要分析的文件 4. 开始分析文件 ...