bzoj 4237: 稻草人
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: 稻草人相关推荐
- bzoj 4237: 稻草人(CDQ分治+单调栈+二分)
4237: 稻草人 Time Limit: 40 Sec Memory Limit: 256 MB Submit: 1352 Solved: 594 [Submit][Status][Discus ...
- BZOJ#4237. 稻草人
4237: 稻草人 Time Limit: 40 Sec Memory Limit: 256 MB Submit: 1483 Solved: 649 [Submit][Status][Discus ...
- bzoj 4237 稻草人
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4237 CDQ.然而却不会做. **分治的话,只要考虑两部分之间对答案的贡献就行了,不用考虑部 ...
- ●BZOJ 4237 稻草人
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4237 题解: CDQ分治,单调栈 把所有点先按x从小到大排序,然后去CDQ分治y坐标. 在分 ...
- bzoj 4237: 稻草人 cdq分治
求有多少个点对 其一个点为左下角 一个点为右下角所形成的矩形内部没有点 每个x与y都不同 一开始的思路: 先按照x坐标排序 进行cdq分治 然后在cdq内对y进行排序 枚举mid+1-r的点作 ...
- ZJOI2019一轮停课刷题记录
Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...
- 一句话题解(20170801~20170125)
8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- S-T平面图中利用最短路求最小割(BZOJ 1001)
BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...
最新文章
- ​超大规模时空数据的分布式存储与应用
- 系统集成项目管理工程师软考辅导——3年真题透解与全真模拟
- Webfrom --图片验证码
- HTML(六)------ CSS
- org.apache.flink.table.api.bridge.java.internal.BatchTableEnvironmentImpl找不到的问题
- [翻译] Visual Studio 2019 RC版发布
- n个数里找出前m个数(或者 从10亿个浮点数中找出最大的1万个)
- shell expect的简单实用
- 如何更有效地从阅读中汲取知识?
- mysql每次update数据,自动更新对应表中时间字段
- Rust : evmap库多读多写尝试
- 分类预测 | MATLAB实现ELM极限学习机多特征分类预测
- scratch 游戏 打鬼游戏 教案
- OLAP和多维数据模型
- CDH集成ES MasterNotDiscoveredException问题解决
- matlab矩形滤波器,MATLAB结合矩形窗设计FIR滤波器
- XSS篇——javascript:伪协议
- CSS实现3D正方体动态旋转效果【源码+GIF图】
- 安装完ubuntu系统后的优化
- 首批学习Java的人,如今怎么样了?