【题解】「AT4303」[ABC119D] Lazy Faith
AT4303 [ABC119D] Lazy Faith[题解][二分]
translation
有 \(a\) 个点 \(s\),有 \(b\) 个点 \(t\),问从点 \(x\) 出发到达至少一个 \(a\) 和一个 \(b\) 的最短距离是多少。
solution
我们先举一个简单的例子,假如我们有 \(2\) 个点 \(s\) 分别在 \(3,6\) 和 \(2\) 个点 \(t\) 分别在 \(2,5\),\(x\) 从 \(4\) 出发。
先画一个图更好的理解

那么我们现在有 \(4\) 种选择:
- 选择 \(s_1\) 和 \(t_1\)
- 选择 \(s_2\) 和 \(t_2\)
- 选择 \(s_1\) 和 \(t_2\)
- 选择 \(s_2\) 和 \(t_1\)
那么可以想想,还有其他的选择吗?并没有!
因为要选择最短的路线,如果在 \(t_1\) 左边或 \(s_2\) 右边还有点的话,若选择它肯定距离长,肯定要舍。
所以总结,只有这四种选法:
- 左 \(s\) 左 \(t\)
- 右 \(s\) 右 \(t\)
- 左 \(s\) 右 \(t\)
- 右 \(s\) 左 \(t\)
所以只要将这 \(4\) 种选法都算出来,取 \(\min\) 即可。
那如何算?
第一个问题:
如何找到在 左/右 边离 \(x\) 最近的 \(s/t\)?
这里我们就要用到 二分
众所周知 用二分可以用 lower_bound 和 upper_bound 函数。
我们在这里简单介绍一下这两种函数。
lower_bound
此函数通过二分的原理,在 \(a\) 数组中找到第一个 \(\leq x\) 的数。
使用:lower_bound(a + 1, a + n + 1, x)upper_bound
使用方法与lower_bound类似,但是找到第一个 \(\le x\) 的数。
那么我们找到在 左/右 边离 \(x\) 最近的 \(s/t\) 就很容易了。
code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#define int long long
using namespace std;
const int NR = 1e5 + 5;
int a, b, q;
int s[NR], t[NR];
void solve() {
int x;
cin >> x;
int ss = lower_bound(s + 1, s + a + 1, x) - s;
int sm = lower_bound(t + 1, t + b + 1, x) - t;
int ans = 9e18;
//左社左寺
if (ss > 1 && sm > 1) {
ans = min(ans, max(x - s[ss - 1], x - t[sm - 1]));
}
//右社右寺
if (ss <= a && sm <= b) {
ans = min(ans, max(s[ss] - x, t[sm] - x));
}
//左社右寺
if (ss > 1 && sm <= b) {
if (x - s[ss - 1] <= t[sm] - x) //如果左比右近或两边距离出发点相等,就先走左边
ans = min(ans, (x - s[ss - 1]) * 2 + (t[sm] - x));
else
ans = min(ans, (t[sm] - x) * 2 + (x - s[ss - 1]));
}
//右社左寺
if (ss <= a && sm > 1) {
if (s[ss] - x <= x - t[sm - 1]) //如果右比左近,就先走右边
ans = min(ans, (s[ss] - x) * 2 + (x - t[sm - 1]));
else
ans = min(ans, (x - t[sm - 1]) * 2 + (s[ss] - x));
}
cout << ans << endl;
return;
}
signed main() {
cin >> a >> b >> q;
for (int i = 1; i <= a; i++) cin >> s[i];
for (int i = 1; i <= b; i++) cin >> t[i];
sort(s + 1, s + a + 1);
sort(t + 1, t + b + 1);
while (q--) solve();
return 0;
}
【题解】「AT4303」[ABC119D] Lazy Faith的更多相关文章
- 题解 「HDU6403」卡片游戏
link Description 桌面上摊开着一些卡牌,这是她平时很爱玩的一个游戏.如今卡牌还在,她却不在我身边.不知不觉,我翻开了卡牌,回忆起了当时一起玩卡牌的那段时间. 每张卡牌的正面与反面都各有 ...
- 题解 「SCOI2016」萌萌哒
link Description 一个长度为 $ n $ 的大数,用 $ S_1S_2S_3 \ldots S_n $表示,其中 $ S_i $ 表示数的第 $ i $ 位,$ S_1 $ 是数的最高 ...
- 题解 「SDOI2017」硬币游戏
题目传送门 Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利. 大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了. 同学们觉得要加强 ...
- 题解 「ZJOI2018」历史
题目传送门 Description 九条可怜是一个热爱阅读的女孩子. 这段时间,她看了一本非常有趣的小说,这本小说的架空世界引起了她的兴趣. 这个世界有 \(n\) 个城市,这 \(n\) 个城市被恰 ...
- 题解 「BZOJ3636」教义问答手册
题目传送门 Description 作为泉岭精神的缔造者.信奉者.捍卫者.传承者,Pear决定印制一些教义问答手册,以满足泉岭精神日益增多的信徒.Pear收集了一些有关的诗选.语录,其中部分内容摘录在 ...
- 题解「BZOJ4310」跳蚤
题目传送门 Description 现在有一个长度为 \(n\) 的字符串,将其划分为 \(k\) 段,使得这 \(k\) 段每一段的字典序最大子串中字典序最大的字符串字典序尽量小.求出这个字符串. ...
- 题解 「BZOJ2137」submultiple
题目传送门 题目大意 给出 \(M,k\) ,求出 \[\sum_{x|M}\sigma(x)^k \] 给出 \(P_i\),满足 \(n=\prod_{i=1}^{n}a_i^{P_i}\),其中 ...
- 题解 「BZOJ2178」圆的面积并
题目传送门 题目大意 给出 \(n\) 个圆,求它们并的面积大小. \(n\le 10^3\) 思路 如果您不会自适应辛普森法,请戳这里学习 其实我们发现,如果我们设 \(f(x)\) 表示 \(x= ...
- 题解 - 「MLOI」小兔叽
小兔叽 \(\texttt{Link}\) 简单题意 有 \(n\) 个小木桩排成一行,第 \(i\) 个小木桩的高度为 \(h_i\),分数为 \(c_i\). 如果一只小兔叽在第 \(i\) 个小 ...
随机推荐
- tcpack--3快速确认模式
接收到数据报后,会调用tcp_event_data_recv(),不管是在慢速路径的tcp_data_queue中调用还是 在快速路径中处理接收数据后直接调用,注意(如果len <= tcp_h ...
- shell编程之输入输出
1.输入 read命令有以下几种常见形式: read var :等待用户输入,从标准输入中读取一行并赋值给变量var read : 标准输入读取一行,并赋值给内置变量REPLY read -a a ...
- UNP——第四章,TCP套接字编程
1.socket 函数 首先被调用的函数,用于选择通信协议. socket调用成功后,得到的套接字为主动套接字CLOSED状态. PF 和 AF 的关系 PF的是协议族,AF是地址族,理论上一个PF包 ...
- java中elasticsearch7.x关于nested类型的api使用,新增+更新
0,定义esHighClient 1 @Configuration 2 public class RestClientConfig { 3 4 //类似:200.188.22.20:9300,200. ...
- 面试中AOP这样说,面试官只有一个字:服!
- 一个Wpf的开发框架
引言 本框架使用Prism做MVVM,优点咱就不说了,主要了容器注入,消息和DI,比自己写省很多事.网上有很多标准的MVVM的使用方法,但是没有形成一个系统级的框架.本框架从登录到具体业务的使用,还有 ...
- 在FL Studio中通过Key Tracking来改善声音
FL Studio中的关键点跟踪(Key Tracking),是一种为MIDI添加更多动态效果的便利工具,在FL Studio中通过使用这个插件能力,我们无需担心自动化或手动调整参数等比较麻烦的问题. ...
- DIV设置滚动条在最底端
网站聊天样式,无论添加什么内容div的滚动条都显示在最底端 将div添加滚动条,给div一定的高度 <div id='up' style='height:100px; width:400px;o ...
- LIS问题$n log_2 n$做法(二分优化)
#include<bits/stdc++.h> using namespace std; const int inf=1e9+5; const int maxn=1e6+5; int n, ...
- CSS3 学习笔记(中)
七.文档流 文档流(normal flow)--网页的基础(最底下的一层),我们所创建的元素默认都是在文档流中进行排列. 对于元素有两个状态:在文档流 或 脱离文档流. 元素在文档流的特点: 块元素: ...