●BZOJ 4237 稻草人
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=4237
题解:
CDQ分治,单调栈
把所有点先按x从小到大排序,然后去CDQ分治y坐标。
在分治的每一层,把所有的点平均地分为上下两个部分,
然后计算下面的点可以对上面的每个点分别造成多少的贡献:
(也就是说,对于上面的每个点,以它作为右上角,看下面的点中有多少个合法的左下角)
假设现在枚举到了上面的第k个点,
如果下面存在这样两个点i,j满足Xi<Xj且Yi<Yj,那么必然i点无法作为一个合法的左下角。
所以我们对下面的X坐标小于Xk的点维护一个Y单调下降的栈,
那么现在是不是栈的大小就是对k点而言,下面合法的左下角的点数。
答案是否定的,因为k点同样会受到上面的点对它的影响,
考虑在上面部分存在这么一个点w,满足Xw<Xk且Yw<Yk,
那么必然在下面部分的合法的左下角的x坐标要大于Xw。
所以具体做法就是,对上面的点维护一个单调上升的栈,对下面的点维护一个单调下降的栈,
然后对于每个上面的点,在下面的点维护出来的单减栈中去二分出合法的左下角的个数,然后累加进答案。
复杂度$O(Nlog^2N)$
代码:
#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
long long ANS;
int N,intop,detop;
int A[MAXN],instk[MAXN],destk[MAXN];
struct Point{
int x,y;
bool operator <(const Point &rtm) const{
return x<rtm.x;
}
}P[MAXN];
int binary(int l,int r,int v){
static int mid,ret; ret=r+1;
while(l<=r){
mid=(l+r)>>1;
if(destk[mid]>v) ret=mid,r=mid-1;
else l=mid+1;
}
return ret;
}
void CDQ(int l,int r){
static int tmpl[MAXN],tmpr[MAXN];
if(l==r) return;
int mid=(l+r)>>1,bl=l-1,br=mid,p;
intop=detop=0;
for(int i=l;i<=r;i++){
if(A[i]>mid){
while(intop&&A[instk[intop]]>A[i]) intop--;
instk[++intop]=i; tmpr[++br]=A[i];
p=binary(1,detop,instk[intop-1]); ANS+=detop-p+1;
}
else{
while(detop&&A[destk[detop]]<A[i]) detop--;
destk[++detop]=i; tmpl[++bl]=A[i];
}
}
for(int i=l;i<=mid;i++) A[i]=tmpl[i];
for(int i=mid+1;i<=r;i++) A[i]=tmpr[i];
CDQ(l,mid); CDQ(mid+1,r);
}
int main(){
static int tmpy[MAXN];
scanf("%d",&N);
for(int i=1;i<=N;i++){
scanf("%d%d",&P[i].x,&P[i].y);
tmpy[i]=P[i].y;
}
sort(P+1,P+N+1); sort(tmpy+1,tmpy+N+1);
for(int i=1;i<=N;i++) A[i]=lower_bound(tmpy+1,tmpy+N+1,P[i].y)-tmpy;
CDQ(1,N);
printf("%lld\n",ANS);
return 0;
}
●BZOJ 4237 稻草人的更多相关文章
- bzoj 4237: 稻草人 -- CDQ分治
4237: 稻草人 Time Limit: 40 Sec Memory Limit: 256 MB Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行 ...
- bzoj 4237 稻草人 - CDQ分治 - 单调栈
题目传送门 传送点I 传送点II 题目大意 平面上有$n$个点.问存在多少个矩形使得只有左下角和右上角有点. 考虑枚举左下角这个点.然后看一下是个什么情况: 嗯对,是个单调栈.但不可能暴力去求每个点右 ...
- bzoj 4237: 稻草人
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- bzoj 4237 稻草人 CDQ
稻草人 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1433 Solved: 626[Submit][Status][Discuss] Descr ...
- bzoj 4237稻草人
按x轴进行分治,将[l,r]分成[l,mid]和[mid+1,r],左下角点x值在[l,mid]中,右上角点x值在[mid+1,r],然后将[l,r]中的所有点按y轴排序,按顺序扫描,若扫描到左下角点 ...
- 稻草人(bzoj 4237)
Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地.和启示中的一样,田地需要 ...
- bzoj 4237 稻 草 人
bzoj 这个矩形有三个限制,分别是右上角点的横纵坐标分别大于左下角废话,并且中间区域没有点.那么可以先按横坐标排序,然后枚举左边的点和右边的点匹配.为了保证复杂度,这里每次把点集一分为二,先递归处理 ...
- BZOJ 4236~4247 题解
BZOJ 4236 JOIOJI f[i][0..2]表示前i个字符中′J′/′O′/′I′的个数 将二元组<f[i][0]−f[i][1],f[i][1]−f[i][2]>扔进map,记 ...
- $CDQ$分治总结
A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...
随机推荐
- Beta敏捷冲刺每日报告——Day3
1.情况简述 Beta阶段Scrum Meeting 敏捷开发起止时间 2017.11.4 00:00 -- 2017.11.5 00:00 讨论时间地点 2017.11.4 晚9:30,电话会议会议 ...
- 201621123044《JAVA程序设计》第一周学习总结
1. 本周学习总结 1.了解了JAVA的诞生以及发展历史简介.JAVA语言的特点,以及JAVA的电脑安装以及环境配置. 2.JAVA不仅可以用eclipse进行编写,也可以在记事本和notepad++ ...
- ThinkPad安装deepin操作系统报错解决方法
目前deepin操作系统,软件也比较多,所以想在自己的thinkpad t430笔记本上安装.但是安装时报错,具体错误忘了看了.反复试了好几次都不行,最后在网上查了,讲bios设置调整之后可以正常安装 ...
- 10-TypeScript中的接口
接口是一种规约的约定,从接口继承的类必须实现接口的约定.在高级开发中,通常接口是用于实现各种设计模式的基础,没有接口,设计模式无从谈起. 定义接口: interface ILog{ recordlog ...
- Win7添加php环境变量.
1) "我的电脑"右键"属性"->高级系统设置->环境变量->系统变量->Path->编辑 2) 将PHP的执行路径的目录&quo ...
- python RE模块的使用
摘要: re模块包括操作正则表达式的函数,一些工作中都需要用到,现在说明下使用方法. 使用说明: 一,re模块下的函数: 函数 描述 compile(pa ...
- spring5——Aop的实现原理(动态代理)
spring框架的核心之一AOP,面向切面编程是一种编程思想.我对于面向切面编程的理解是:可以让我们动态的控制程序的执行流程及执行结果.spring框架对AOP的实现是为了使业务逻辑之间实现分离,分离 ...
- 从Mybatis源码理解jdk动态代理默认调用invoke方法
一.背景最近在工作之余,把开mybatis的源码看了下,决定自己手写个简单版的.实现核心的功能即可.写完之后,执行了一下,正巧在mybatis对Mapper接口的动态代理这个核心代码这边发现一个问题. ...
- mysql Access denied for user root@localhost错误解决方法
select * from user \G use mysql select * from user limit 1 \G update user set Host='%' where `User`= ...
- SSM登陆注册
package com.coingod.controller; import java.io.IOException;import java.io.PrintWriter;import java.ut ...