Description

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

solution

正解:CDQ分治.
我们分析满足 \(x[i]<x[j],y[i]<y[j]\),并且不存在 \(k\),\(x[i]<x[k]<x[j],y[i]<y[k]<y[k]\)的算作一个满足条件的点对.

以上二维偏序可以用分治求解,我们可以分治 \(x\).
分治中按 \(y\) 排序,我们考虑 \(mid\) 左边对 \(mid\) 右边的贡献:

左边是作为矩形的左下角,右边作为右上角.

我们要意识到,在 \(mid\) 右边 对当前点 \(i\) 影响最大的一定是 \(y\) 比 \(i\) 小,\(x\) 比 \(i\) 也小的点,因为 \(i\) 是作为矩形的右上角,所以这个的点会成为矩形中的点,不会形成矩形,所以我们维护一个 \(x\) 递增的单调栈,左边维护一个 \(x\) 递减的单调栈,当前右边的点 \(i\) ,能够和左边满足\(y<=y[i],y>=y[st[top]]\)的点匹配,然后每一次在左边栈中二分即可,画个图很好理解

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=200005;
int n,st[N],top=0,xy[N],pi=0;long long ans=0;
struct node{int x,y;
}a[N];
bool comp(const node i,const node j){return i.x<j.x;}
bool camp(const node i,const node j){return i.y<j.y;}
void solve(int l,int r){if(l==r)return ;int mid=(l+r)>>1;solve(l,mid);solve(mid+1,r);top=0;pi=0;int j=l,li;sort(a+l,a+mid+1,camp);sort(a+mid+1,a+r+1,camp);for(int i=mid+1;i<=r;i++){while(a[j].y<=a[i].y && j<=mid){while(top && a[j].x>=a[st[top]].x)top--;st[++top]=j;j++;}while(pi && a[i].x<a[xy[pi]].x)pi--;xy[++pi]=i;li=a[xy[pi-1]].y;int L=1,R=top,mi,ret=-1;while(L<=R){mi=(L+R)>>1;if(a[st[mi]].y>=li)ret=mi,R=mi-1;else L=mi+1;}if(ret!=-1)ans+=top-ret+1;}
}
void work()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a+1,a+n+1,comp);solve(1,n);printf("%lld\n",ans);
}int main()
{work();return 0;
}

转载于:https://www.cnblogs.com/Hxymmm/p/7702200.html

bzoj 4237: 稻草人相关推荐

  1. bzoj 4237: 稻草人(CDQ分治+单调栈+二分)

    4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1352  Solved: 594 [Submit][Status][Discus ...

  2. BZOJ#4237. 稻草人

    4237: 稻草人 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 1483  Solved: 649 [Submit][Status][Discus ...

  3. bzoj 4237 稻草人

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 CDQ.然而却不会做. **分治的话,只要考虑两部分之间对答案的贡献就行了,不用考虑部 ...

  4. ●BZOJ 4237 稻草人

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

  5. bzoj 4237: 稻草人 cdq分治

    求有多少个点对  其一个点为左下角  一个点为右下角所形成的矩形内部没有点 每个x与y都不同 一开始的思路: 先按照x坐标排序  进行cdq分治 然后在cdq内对y进行排序  枚举mid+1-r的点作 ...

  6. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  7. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

  8. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  9. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

最新文章

  1. ​超大规模时空数据的分布式存储与应用
  2. 系统集成项目管理工程师软考辅导——3年真题透解与全真模拟
  3. Webfrom --图片验证码
  4. HTML(六)------ CSS
  5. org.apache.flink.table.api.bridge.java.internal.BatchTableEnvironmentImpl找不到的问题
  6. [翻译] Visual Studio 2019 RC版发布
  7. n个数里找出前m个数(或者 从10亿个浮点数中找出最大的1万个)
  8. shell expect的简单实用
  9. 如何更有效地从阅读中汲取知识?
  10. mysql每次update数据,自动更新对应表中时间字段
  11. Rust : evmap库多读多写尝试
  12. 分类预测 | MATLAB实现ELM极限学习机多特征分类预测
  13. scratch 游戏 打鬼游戏 教案
  14. OLAP和多维数据模型
  15. CDH集成ES MasterNotDiscoveredException问题解决
  16. matlab矩形滤波器,MATLAB结合矩形窗设计FIR滤波器
  17. XSS篇——javascript:伪协议
  18. CSS实现3D正方体动态旋转效果【源码+GIF图】
  19. 安装完ubuntu系统后的优化
  20. 首批学习Java的人,如今怎么样了?

热门文章

  1. MVVM架构的优缺点
  2. 使用python 加代理刷流量
  3. 方正台式计算机初始bios密码,方正台式计算机BIOS设置U盘启动
  4. Python调用gige相机
  5. mysql 强制使用多个索引_mysql强制使用索引
  6. 北大青鸟测试培训目录
  7. python编写计算器-python代码编写计算器小程序
  8. 私域流量运营之增长运营:用户运营实战与行为数据洞察,私域流量运营者必修课!...
  9. Tarde破解版使用, 悬赏提问
  10. 一个在线的文献计量分析工具(作者或文献间的联系可视化)