●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\)分治与其他分治最本质的 ...
随机推荐
- [福大软工] W班 第2次成绩排行榜
作业链接 https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/866 评分细则 本次个人项目分数由三部分组成 ...
- PTA常见错误
1.最常犯的错误. 格式错误 在PTA程序检测中,输入输出要严格按照题目要求.输出的格式要完全按照题目要求来,该空格地方空格,该换行要换行.否则,就算你运行结果是对的,PTA还是提示你格式错误 比如下 ...
- c语言的第三次---单程循环结构
一.PTA实验作业 题目1 1.代码 int N,i; double height; //height代表身高 char sex; //代表男女性别 scanf("%d",& ...
- 咸鱼翻身beta冲刺博客集
咸鱼翻身beta冲刺博客集 凡事预则立-于Beta冲刺前 beta冲刺1-咸鱼 beta冲刺2-咸鱼 beta冲刺3-咸鱼 beta冲刺4-咸鱼 beta冲刺5-咸鱼 beta冲刺6-咸鱼 beta冲 ...
- POST请求的提交
var http = require("http"); var querystring = require("querystring"); //创建服务器 va ...
- PM2使用心得
PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控.自动重启.负载均衡等,而且使用非常简单. 安装 npm install -g pm2 常用命令 $ npm i ...
- 解决vue2.0路由 TypeError: Cannot read property 'matched' of undefined 的错误问题
刚开始使用vue-router2.0,虽然也用了vux,用起来却发现一个问题--具体如下: 正常情况下使用脚手架跑完之后,然后修改源项目,首先在main.js入口里把该import进去的vuex,vu ...
- ASCII排序
ASCII码排序 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个字符. 输入 第一行输 ...
- 08-TypeScript中的类
类的概念通常是在后端开发中实现的思想,比如C#.C++或Java,传统的JavaScript开发通过使用原型模式来模拟类的功能.在TypeScript中,天生就是支持类 的,可以让前端的开发更加具有面 ...
- JAVA_SE基础——35.static修饰成员函数
在Java中适用static关键字修饰的方法称为静态方法. 声明静态方法的语法格式如下: 权限修饰符 static 数据类型 方法名(){ 方法体 } 静态方法 可以使用类名直接调用 类名.方 ...