题链:

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;
}

  

转载于:https://www.cnblogs.com/zj75211/p/8552013.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: 稻草人

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

  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. oracle自增列问题i,关于oracle中自增列问题
  2. 如何用matlab读取npz文件,Python Numpy中数据的常用的保存与读取方法
  3. Python自定义函数的创建、调用和函数的参数详解
  4. Bash中的shopt选项
  5. python-time.time()
  6. 家用笔记本电脑什么牌子好_电烤箱什么牌子好?哪个牌子的烤箱质量好?家用烤箱什么牌子质量好?...
  7. 选择排序(C++版)
  8. 3位高二女生用大数据成功预测地铁出站人数 | 00后正在抛弃你
  9. 链上体育和游戏平台Rage.Fan完成160万美元私募轮融资
  10. 百度系无人车创业公司领骏科技完成新一轮融资
  11. 凸二次规划的解法(x取值具有上确界)
  12. Mathematica图片裁切
  13. react-native 关闭黄色警告
  14. 爬取虎扑网站上NBA球员数据信息
  15. android 提纲挈领
  16. 【转】欧式空间与酉空间——概念区分
  17. 干货来了,这些物联网基础知识你了解吗
  18. 怎么样去申请免费的云主机
  19. signature=45f0fd12ff31dea1feafec2c512144de,急性荨麻疹伴心电图异常与变应原检测123例相关性研究...
  20. 自己用C#做的一个万年历

热门文章

  1. Redis 主从同步实现过程
  2. 银行笔试之中国邮储(2020秋招)
  3. JQuery checkedBox全选和全部选
  4. Openlayers View 限制显示范围、限制缩放级别、限制拖动等
  5. intel最新服务器平台,五舟科技发布基于Intel Purley平台的下一代服务器产品
  6. C# SqlServer 数据库连接字符串
  7. Qualcomm messaging Interface(QMI)消息定义概述
  8. 从计算到智算,计算产业掀起什么样的浪潮?
  9. POJ3666-Making the Grade-dp
  10. 成都七中高考成绩2021年查询,2021成都5大热门高中排行