AtCoder Beginner Contest 215 F题题解
F - Dist Max 2
什么时候我才能突破\(F\)题的大关...
算了,不说了,看题。
简化题意:给定\(n\)个点的坐标,定义没两个点的距离为\(min(|x_i-x_j|,|y_i-y_j|)\),求所有点对中距离的最大值。其实看到一个最小,一个最大就应该想到二分的...最小值最大或最大值最小,二分答案不是最擅长解决这类问题的吗?但有时候就会想想了,为什么二分答案在这些条件下就十分适用了...考虑最小值最大(或最大值最小),说明有很多方案,每个方案都有对应的最小值,求所有方案的最大值,显然比最大值小的方案肯定都能实现,那这不就满足答案单调性了吗?再看我们二分答案以后,我们给定一个答案,之后只需判定是否合法就行。这样的话我们还需根据给定的答案去构造一种满足答案的方案即可,这可比解决最优化的问题简单多了。
好了,不多时候了,回到这个题,我们二分一个答案后怎么判断答案是否合法,由于是两维的关系,我门先按\(x\)排序消掉一维,比如说我们二分的答案为\(k\),那我们考虑每个点向后找其他的点匹配,对于当前点\(i\),显然只有\(x_i+k\)之后的点才能被统计,我们可以将之后的点放到一个set里面,这样就能快速找到合法的\(x\)中是否有合法的\(y\)了。总复杂度\(O(nlog^2n)\)这个复杂度竟然T了,好吧,二分答案的log大概30多,再加上set,确实可能会T,但我们考虑这个set的操作,实际上我们需要查询的就是一个后缀的最小值和最大值,这里发现可以直接预处理,开心的省去一个log,看这次还过不过!!!
//不等,不问,不犹豫,不回头.
#include<bits/stdc++.h>
#define _ 0
#define ls p<<1
#define db double
#define rs p<<1|1
#define P 1000000007
#define ll long long
#define INF 1000000000
#define get(x) x=read()
#define PLI pair<ll,int>
#define PII pair<int,int>
#define ull unsigned long long
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define rep(x,y,z) for(int x=y;x<=z;++x)
#define fep(x,y,z) for(int x=y;x>=z;--x)
#define go(x) for(int i=link[x],y=a[i].y;i;y=a[i=a[i].next].y)
using namespace std;
const int N=2e5+10;
int n,mn[N],mx[N];
struct wy{int x,y;}a[N];
inline int read()
{
int x=0,ff=1;
char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') ff=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*ff;
}
inline bool cmp(wy a,wy b) {return a.x<b.x;}
inline bool check(int k)
{
int r=1;
rep(i,1,n)//为每个左端点找合适的右端点
{
while(r<=n&&a[r].x-a[i].x<k) ++r;
if(r>n) return false;
if(abs(mn[r]-a[i].y)>=k||abs(mx[r]-a[i].y)>=k) return true;
}
return false;
}
int main()
{
//freopen("1.in","r",stdin);
get(n);
rep(i,1,n) get(a[i].x),get(a[i].y);
sort(a+1,a+n+1,cmp);
mn[n+1]=INF*2;mx[n+1]=-INF;
fep(i,n,1) mn[i]=min(mn[i+1],a[i].y),mx[i]=max(mx[i+1],a[i].y);
int l=0,r=INF*2;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
put(l);
return (0^_^0);
}
//以吾之血,铸吾最后的亡魂.
AtCoder Beginner Contest 215 F题题解的更多相关文章
- AtCoder Beginner Contest 213 F题 题解
F - Common Prefixes 该题也是囤了好久的题目了,看题目公共前缀,再扫一眼题目,嗯求每个后缀与其他后缀的公共前缀的和,那不就是后缀数组吗?对于这类问题后缀数组可是相当在行的. 我们用后 ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 068 ABCD题
A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 220部分题(G,H)题解
刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...
- AtCoder Beginner Contest 188 F - +1-1x2 思维题
题目描述 给你两个数 \(x\),\(y\) 可以对 \(x\) 进行 \(+1,-1\) 或 \(\times 2\) 的操作 问最少操作多少次后变为 \(y\) \(x,y \leq 10^{18 ...
- AtCoder Beginner Contest 069 ABCD题
题目链接:http://abc069.contest.atcoder.jp/assignments A - K-City Time limit : 2sec / Memory limit : 256M ...
- AtCoder Beginner Contest 070 ABCD题
题目链接:http://abc070.contest.atcoder.jp/assignments A - Palindromic Number Time limit : 2sec / Memory ...
- AtCoder Beginner Contest 057 ABCD题
A - Remaining Time Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Dol ...
随机推荐
- Vue3的其他属性和API函数
customRef() 自定义Ref函数实现Ref()的相关功能 1 <script> 2 import { ref customRef} from 'vue' 3 4 function ...
- Django边学边记—模型查询
查询集 两大特性 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代.序列化.与if合用 缓存:查询集的结果被存下来之后,再次查询时会使用之前缓存的数据 返回列 ...
- python刷题第二周
1: 第3章-5 字符转换 (15 分) 本题要求提取一个字符串中的所有数字字符('0'--'9'),将其转换为一个整数输出. 输入格式: 输入在一行中给出一个不超过80个字符且以回车结束的字符串. ...
- PHP ASCII 排序方法
//自定义ascii排序function ASCII($params = array()){ if(!empty($params)){ $p = ksort($params); if($p){ $st ...
- 服务器内部模拟Http请求
前言: 在做小程序的开发时需要获取用户的openId用来做唯一标识,来获取对应用户的相关数据 官方的文档说明上有四个必须传的参数 其中appId和appSecret可在自己的微信公众号平台上获取,同时 ...
- bug 找不到或无法加载主类main.java.*
开发时遇到的的一个问题,不知道是什么引起的,一个maven springboot 的项目,主类启动的时候报错,说没找到 主类,起先怀疑是springboot的问题,随手写一个单独的类,有main方法, ...
- 三、mybatis多表关联查询和分布查询
前言 mybatis多表关联查询和懒查询,这篇文章通过一对一和一对多的实例来展示多表查询.不过需要掌握数据输出的这方面的知识.之前整理过了mybatis入门案例和mybatis数据输出,多表查询是在前 ...
- 好未来数据中台 Node.js BFF实践(一):基础篇
好未来数据中台 Node.js BFF实践系列文章列表: 基础篇 实战篇(TODO) 进阶篇(TODO) 好未来数据中台的Node.js中间层从7月份开始讨论可行性,截止到9月已经支持了4个平台,其中 ...
- requirejs的加载原理 - 场景1. 定义一个require依赖a模块
我们学习一个新的技术,熟练的使用之后,就应该去探索它的原理.这篇文章我们来探索下requirejs的原理. 从4个场景来探索requirejs的原理 场景1. 定义一个require依赖b模块 场景2 ...
- 如何通过 Serverless 轻松识别验证码?
作者 | 江昱 来源 | Serverless 公众号 前言 Serverless 概念自被提出就倍受关注,尤其是近些年来 Serverless 焕发出了前所未有的活力,各领域的工程师都在试图将 Se ...