题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237

CDQ。然而却不会做。

**分治的话,只要考虑两部分之间对答案的贡献就行了,不用考虑部分内的。

所以就只考虑两部分之间构成的矩形。

考虑枚举上面部分或下面部分的点。不难(?)发现要使用单调栈。因为另一部分的种种限制很符合单调栈的样子。

同时自己枚举的这部分也要弄单调栈。这样就能知道本部分中第一个限制自己的点的位置,进而把这个位置到自己之间的所有另一部分符合要求的点加到答案里。

枚举上面部分的点的话,本部分限制自己的点在自己左边;而枚举下面部分的点的话,本部分限制点在右边,就得从右往左推了,比较不顺。所以枚举上面部分的点吧。

然后另一部分的点只保留在栈里的,二分找到上面部分的限制点(栈里当前点的上一个点)到当前点之间的部分,计入答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=2e5+5,INF=1e9+5;
int n,stack[N],top;
ll ans;
struct Node{int x,y;bool operator<(const Node &k)const{return x<k.x;}
}a[N];
bool cmp(Node u,Node v){return u.y<v.y;}
void cdq(int l,int r)
{if(l==r)return;int mid=((l+r)>>1);cdq(l,mid);cdq(mid+1,r);sort(a+l,a+mid+1,cmp);sort(a+mid+1,a+r+1,cmp);int k,u=mid+1;for(int i=l;i<=mid;i++){    //下面那行导致n^2 for(k=i+1;k<=mid&&a[k].x<a[i].x;k++);if(k>mid)k=0;    //故底下赋初值 int mn=INF;while(a[u].y<a[i].y&&u<r)u++;if(a[u].y<a[i].y)break;for(int j=u;j<=r;j++){if(a[j].y>a[k].y)break;if(a[j].x<mn)ans++,mn=a[j].x;    //故底下赋初值
        }}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].y,&a[i].x);//
    sort(a+1,a+n+1);a[0].y=INF;a[0].x=INF;cdq(1,n);printf("%lld",ans);return 0;
}

以为自己写了个nlogn的,其实是n^2logn

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=2e5+5,INF=1e9+5;
int n,stack1[N],top1,stack2[N],top2;
ll ans;
struct Node{int x,y;bool operator<(const Node &k)const{return x<k.x;}
}a[N];
bool cmp(Node u,Node v){return u.y<v.y;}
void cdq(int l,int r)
{if(l==r)return;int mid=((l+r)>>1);cdq(l,mid);cdq(mid+1,r);sort(a+l,a+mid+1,cmp);sort(a+mid+1,a+r+1,cmp);top1=top2=0;int j=l;for(int i=mid+1;i<=r;i++){while(top1&&a[stack1[top1]].x>a[i].x)top1--;stack1[++top1]=i;for(;j<=mid&&a[j].y<a[i].y;j++){while(top2&&a[stack2[top2]].x<a[j].x)top2--;stack2[++top2]=j;}int L=1,R=top2,as=top2+1;    //如果stack2里一个也没有<==>下面的都在当前点的右边 while(L<=R){int md=((L+R)>>1);    //下面那个是a[stack2[md]]!!!不是a[md]!!! if(a[stack2[md]].y>a[stack1[top1-1]].y)as=md,R=md-1;    //此处需要对a[0].y赋初值 else L=md+1;}ans+=top2-as+1;}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].y,&a[i].x);//
    sort(a+1,a+n+1);a[0].y=-1;cdq(1,n);    //坐标>=0 printf("%lld",ans);return 0;
}

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

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

  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. linux 源码编译upx 压缩软件
  2. gdb调试fork+exec创建的子进程的方法
  3. IIS利用X-Forwarded-For获得来访者的真实IP
  4. K-近邻分类算法KNN
  5. Ajax.NET 作者发布支持Visual Web Developer 2005的模板安装
  6. docker kaniko push推送镜像至harbor报错:x509: certificate signed by unknown authority(命令中添加 --skip-tls-ver)
  7. 转:Fiddler抓包工具总结
  8. STL源码剖析 关联式容器 红黑树
  9. command对象的获取 c#
  10. TensorFlow 1.0已死,TensorFlow 2.0万岁
  11. ads design environment_ADS射频仿真软件培训材料.pdf
  12. IP报文头详解以及定义
  13. python 换行打印
  14. [收藏]经典爱情十句话
  15. 蛋白质二级结构预测Linux,蛋白质稳定性预测工具-Rosetta ddg_monomer
  16. 《金融时报》:技术的“可为”与“不可为”
  17. Android开发已经到了要烧香求职的地步了?
  18. Oracle常用函数总结
  19. Android 微信支付配置流程
  20. 5G时代金融服务如何升级?网易云信助力银行数字化建设

热门文章

  1. 点云的无序性_PU-Net:解决3D点云数据的上采样问题
  2. 服务器信息采集协议,服务器信息采集
  3. linux 账户安全,在Linux上踢除某个用户和账户安全
  4. 分别是什么意思_你知道抗震支架T和TL分别代表什么意思?
  5. c语言排序教学过程,C语言中冒泡排序算法教学设计
  6. assign深拷贝_经典前端面试题: Object.assign 是浅拷贝还是深拷贝?实现深拷贝的方法有哪些?...
  7. 四川大学计算机学院夏欣,自适应窗口的图像平滑去噪.pdf
  8. findwindowex子窗口类型有哪几种_光学玻璃有哪几种类别?一文告诉你
  9. java 获取第一帧_java获取视频的第一帧
  10. 深度神经网络在基于视觉的目标检测中的应用