刷题总结——稻草人(bzoj4237cdq分治)
题目:
Description
Input
Output
Sample Input
0 0
2 2
3 4
4 3
Sample Output
HINT

题解:
首先每次分治前将点按y轴排序,消除y轴的影响,然后分为上下两部分,分别按x轴排序···
然后用两个单调栈分别维护上部分和下部分,上部分保证y单调递增,下部分保证y单调递减,这样每次将上部分的点作为右上角,找下部分符的点的数量
由于是按y轴排序且用了单调栈,我们已经排除了y轴的影响,只用找x轴符合情况的点,这时利用我们已经按x轴排的序,直接二分即可
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=2e5+;
struct node
{
int x,y;
}p[N];
int n,stack1[N],top1,stack2[N],top2;
long long ans=;
inline bool cmpy(node a,node b)
{
return a.y<b.y;
}
inline bool cmpx(node a,node b)
{
return a.x<b.x;
}
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f;
}
inline void solve(int l,int r)
{
if(l==r) return;
int mid=(l+r)/;top1=top2=;
sort(p+l,p+r+,cmpy);
sort(p+l,p+mid+,cmpx);sort(p+mid+,p+r+,cmpx);
int j=l;
for(int i=mid+;i<=r;i++)
{
while(top1&&p[stack1[top1]].y>=p[i].y) top1--;
stack1[++top1]=i;
while(j<=mid&&p[j].x<p[i].x)
{
while(top2&&p[stack2[top2]].y<=p[j].y) top2--;
stack2[++top2]=j;
j++;
}
int st=p[stack1[top1-]].x;
int le=,ri=top2,anss=-;
while(le<=ri)
{
int mi=(le+ri)/;
if(p[stack2[mi]].x>st) anss=mi,ri=mi-;
else le=mi+;
}
if(anss!=-)
ans+=top2-anss+;
}
solve(l,mid),solve(mid+,r);
}
int main()
{
//freopen("a.in","r",stdin);
n=R();
for(int i=;i<=n;i++)
p[i].x=R(),p[i].y=R();
p[].x=-,p[].y=-;
solve(,n);
printf("%lld",ans);
return ;
}
注意两个细节:
一是每次分治前都要按y轴排序
二是插入一个xy均为-1的点,不然后面二分时会出错
刷题总结——稻草人(bzoj4237cdq分治)的更多相关文章
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- C#LeetCode刷题-分治算法
分治算法篇 # 题名 刷题 通过率 难度 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)-该题未达最优解 30 ...
- NOIp2018停课刷题记录
Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...
- 【刷题】BZOJ 2001 [Hnoi2010]City 城市建设
Description PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少 ...
- BZOJ第一页刷题计划
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...
- OI刷题录——hahalidaxin
16-3-25 —— bzoj 2049 [Sdoi2008]Cave 洞穴勘测:LCT入门 bzoj 2002 [Hnoi2010]Bounce 弹飞绵羊:LCT Tsinsen A1303. t ...
- 【刷题】BZOJ 3365 [Usaco2004 Feb]Distance Statistics 路程统计
Description 在得知了自己农场的完整地图后(地图形式如前三题所述),约翰又有了新的问题.他提供 一个整数K(1≤K≤109),希望你输出有多少对农场之间的距离是不超过K的. Input 第1 ...
- 【BZOJ4237】稻草人 cdq分治+单调栈+二分
[BZOJ4237]稻草人 Description JOI村有一片荒地,上面竖着N个稻草人,村民们每年多次在稻草人们的周围举行祭典. 有一次,JOI村的村长听到了稻草人们的启示,计划在荒地中开垦一片田 ...
- C#LeetCode刷题,走进Google,走近人生
概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/1015 访问. 本系列博文将会向大家展示我在LeetCode上的刷 ...
随机推荐
- 解除phpMyAdmin导入大型MySQL数据库文件大小限制
phpMyAdmin 导入大型数据库文件大小限制配置… 1. 修改 php.ini 文件中下列3项的值: upload_max_filesize, memory_limit 和 post_max_si ...
- RestSharp使用备忘
(1)一般调用: public static List<T> Execute<T>(string resourceUrl, object obj, out int totalN ...
- 关于在vue 中使用百度ueEditor
1. 安装 npm i vue-ueditor --save-dev 2.从nodemodels 取出ueditor1_4_3_3 这整个目录,放入vue 的 static 目录 3.配置 ued ...
- 【dp】守望者的逃离
妙 题目描述 恶魔猎手尤迪安野心勃勃,他背着了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快 ...
- HashMap与ArrayMap(和SparseArray)的比较与选择
HashMap与ArrayMap(和SparseArray)的比较与选择 2017年12月26日 06:04:38 阅读数:61 标签: androidjavahashmaparraymap数据结构 ...
- charles抓手机包
charles抓手机包 如果是使用charles抓包.一定要tm的保证手机和电脑连的是一个网. 1.proxy setting,查看charles,端口 2.勾选 3.ipconfig,查 ...
- DeepFaceLab小白入门(1):软件简介!
简介 DeepFaceLab是一种利用深度学习识别和交换图片和视频中的人脸的工具 这是一个github上的开源项目,所有人都可以查看源代码也能免费使用.个人认为这个项目的最大优点就是安装超级简单,几乎 ...
- Django之FileField字段
头像上传 在头像上传的时候,属于文件类型 首先视图函数获取的时候,request.FILES.get('文件名变量') avatar_obj = request.FILES.get('avatar') ...
- perl-tips-1
.pm 应该保存 Perl Module,也就是 Perl 模块.例如 Socket.pm.pl 应该保存 Perl Library,也就是 Perl 库文件.例如 perldb.pl.plx 应该保 ...
- CodeForces 703A Mishka and trip
Description Little Mishka is a great traveller and she visited many countries. After thinking about ...