Description

JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典。
有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田地。和启示中的一样,田地需要满足以下条件:
田地的形状是边平行于坐标轴的长方形;
左下角和右上角各有一个稻草人;
田地的内部(不包括边界)没有稻草人。
给出每个稻草人的坐标,请你求出有多少遵从启示的田地的个数

Input

第一行一个正整数N,代表稻草人的个数
接下来N行,第i行(1<=i<=N)包含2个由空格分隔的整数Xi和Yi,表示第i个稻草人的坐标

Output

输出一行一个正整数,代表遵从启示的田地的个数

Sample Input

4
0 0
2 2
3 4
4 3

Sample Output

3

HINT

所有满足要求的田地由下图所示:
 
1<=N<=2*10^5
0<=Xi<=10^9(1<=i<=N)
0<=Yi<=10^9(1<=i<=N)
Xi(1<=i<=N)互不相同。
Yi(1<=i<=N)互不相同。

Source

JOI 2013~2014 春季training合宿 竞技3 By PoPoQQQ

到现在才做稻草人的我...,其实这个题也不算太难,今天考试就是要用这个东西优化dp;

对于平面点对计数,我们考虑分治,那么我们假设按照y来分治,那么图分为上半部分和下半部分;

我们只考虑跨过分界线的,同侧的递归处理(注意如果是用cdq处理dp的话,因为右区间要先被左区间更新,再去更新同侧的,所以顺序有点不一样,还要sort);

那么右上角在上半部分,左下角在下半部分,于是我们枚举右上角;

对于右上角的限制,只要有一个横坐标小于他且纵坐标小于他的点就不行,于是我们先按照按照横坐标排序,这样我们就能用递增单调栈求出左边第一个小于他的位置;

然后我们考虑左下角的限制,如果存在一个横坐标大于他且纵坐标大于他的就不合法,我们依然是按照横坐标排序,然后我们相当于是要维护一个递减的单调栈,每个点后面的点就都合法;

我们需要在下方找到横坐标比右上角限制点大的第一个点,然后从这个点开始往后到栈顶就都是合法的了,这个我们在单调栈中二分,然后直接统计即可;

具体实现方法就是两个单调栈一起建,然后更新;

//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=300050;
struct data{
int x,y;
}a[N],b[N];
int n,tp1,tp2,p[N],q[N];
ll ans;
bool cmp(const data &a,const data &b){
return a.y<b.y;
};
int find(int x,int l,int r){
int ret=r+1;
while(l<=r){
int mid=(l+r)>>1;
if(a[q[mid]].x>=x) r=mid-1,ret=mid;
else l=mid+1;
}
return ret;
}
void solve(int l,int r){
if(l==r) return;
int mid=(l+r)>>1;
solve(l,mid);solve(mid+1,r);
tp1=0;tp2=0;int j=l;
for(int i=mid+1;i<=r;i++){
while(tp1&&a[i].y<a[p[tp1]].y) tp1--;
p[++tp1]=i;
for(;a[j].x<a[i].x&&j<=mid;j++){
while(tp2&&a[j].y>a[q[tp2]].y) tp2--;
q[++tp2]=j;
}
ans+=tp2-find(a[p[tp1-1]].x,1,tp2)+1;
}
j=l;int k=mid+1;
for(int i=l;i<=r;i++){
if(j<=mid&&(a[j].x<a[k].x||k>r)) b[i]=a[j++];
else b[i]=a[k++];
}
for(int i=l;i<=r;i++) a[i]=b[i];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+1+n,cmp);
solve(1,n);printf("%lld\n",ans);
return 0;
}

bzoj 4237: 稻草人的更多相关文章

  1. bzoj 4237: 稻草人 -- CDQ分治

    4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行 ...

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

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

  3. ●BZOJ 4237 稻草人

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4237 题解: CDQ分治,单调栈 把所有点先按x从小到大排序,然后去CDQ分治y坐标. 在分 ...

  4. bzoj 4237 稻草人 CDQ

    稻草人 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1433  Solved: 626[Submit][Status][Discuss] Descr ...

  5. bzoj 4237稻草人

    按x轴进行分治,将[l,r]分成[l,mid]和[mid+1,r],左下角点x值在[l,mid]中,右上角点x值在[mid+1,r],然后将[l,r]中的所有点按y轴排序,按顺序扫描,若扫描到左下角点 ...

  6. 稻草人(bzoj 4237)

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

  7. bzoj 4237 稻 草 人

    bzoj 这个矩形有三个限制,分别是右上角点的横纵坐标分别大于左下角废话,并且中间区域没有点.那么可以先按横坐标排序,然后枚举左边的点和右边的点匹配.为了保证复杂度,这里每次把点集一分为二,先递归处理 ...

  8. 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,记 ...

  9. $CDQ$分治总结

    A.\(CDQ\) 分治 特别基础的教程略. \(CDQ\)分治的优缺点: ( 1 )优点:代码量少,常数极小,可以降低处理维数. ( 2 )缺点:必须离线处理. \(CDQ\)分治与其他分治最本质的 ...

随机推荐

  1. python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言)

    python requests抓取NBA球员数据,pandas进行数据分析,echarts进行可视化 (前言) 感觉要总结总结了,希望这次能写个系列文章分享分享心得,和大神们交流交流,提升提升. 因为 ...

  2. Java语句语法

    一.流程控制语句 1.分支语句 1)if else 语法:(写法1) if(条件1){     //写一次 满足条件1执行在代码 }else if(条件2){    //写0或n次 不满足条件1,满足 ...

  3. 14. 监视ZooKeeper实例

    ZooKeeper服务可以通过以下两种方式进行监控: 使用一组四个字母的单词命令来监视健康状态 使用ZooKeeper内置的Java管理扩展功能 四个字母的单词命令 ZooKeeper响应一组命令,每 ...

  4. RabbitMQ Cluster群集安装配置

    #RabbitMQ Cluster群集安装配置 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ########## ...

  5. 实践作业1:测试管理工具实践 Day1

    1.熟悉课程平台2.选取小组作业工具并分工3.申请博客4.提交<高级软件测试技术SPOC2017年秋学生博客地址汇总>问卷5.着手熟悉Testlink

  6. 在没有DOM操作的日子里,我是怎么熬过来的(终结篇)

    前言 在我写终结篇的日子里,Vue版本稳定在2.9.1.当我摸清Vue的脉络之后,以一个爬坑无数的亲历者的身份,谈谈我在MVVM时代里遇到的那些事儿. 接下来,正文从这开始~ 好多童鞋学习Vue都有灯 ...

  7. 2016第七届 蓝桥杯 全国总决赛B题(完全平方数) (练习)

    道友给看了一道题目,就记录一下吧 题目: 给你0,1,2,3,4,5,6,7,8,9十个数字,要你选出任意一个或几个组合在一起成为完全平方数,每个数字都必须选且只能选一次,求可能的方案. 比如有其中几 ...

  8. 关于磁盘冗余阵列、热备、群集、负载均衡、云计算、F5、Nginx等的概念和基本原理

    在系统部署实施过程中,客户往往会关注系统的可用性方面的指标. 对于一个具备高可用性的系统来说, 多机部署方案是必不可少的. 我们这个知识分享,就从多个不同层面来介绍多机部署方案. ---------- ...

  9. XSS攻击原理及防御措施

    概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器 执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列 表,然后向联系 ...

  10. Python创建二维数组(关于list的一个小坑)

    0.目录 1.遇到的问题 2.创建二维数组的办法 3.1 直接创建法 3.2 列表生成式法 3.3 使用模块numpy创建 1.遇到的问题 今天写Python代码的时候遇到了一个大坑,差点就耽误我交作 ...