【题解】「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\) 个小 ...
随机推荐
- 使用webhook watch pod
- python pip install指定国内源镜像
有时候安装一些依赖包,网不好,直接超时,或者这个包就是死都下不下来的时候,可以指定国内源镜像. pip install -i 国内镜像地址 包名 e.g. pip install -i http:/ ...
- Debian 64位内核升级步骤
安装相关依赖包 apt-get install bzip2 libncurses5-dev kernel-package zlib1g-dev gcc make kernel-package wget ...
- Charles mock数据详解
Charles是一款非常好用的代理工具,关于Charles的安装.破解.安装证书,连接手机代理等使用方法详见我之前的博客:https://www.cnblogs.com/feng0815/p/8043 ...
- [原题复现]2019上海大学生WEB-Decade(无参数RCE、Fuzz)
简介 原题复现: 考察知识点:无参数命令执行.Fuzz 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 环境复现 ...
- RSA(攻防世界)Rsa256 -- cr4-poor-rsa
RSA256 [攻防世界] 题目链接 [RSA256] 下载附件得到两个文件. 猜测第一个 txt 文件 可能为RSA加密密文 ,第二个估计就是密钥.依次打开看看: 果然如此. 目标: 寻找 n.e. ...
- idea中安装阿里巴巴的代码规范插件
1.打开iead软件,从左上角点击File -> Settings -> Plugins 2.安装完成后,重启idea软件,即可正常使用了.
- docker 中的mysql启动端口号总是被占用解决
解决: 1 查 netstat -lnp|grep 3306 2 杀 kill -9 3819 3 再查 netstat -lnp|grep 3306 4 发现还有,杀不尽 5 重启docker 6 ...
- JDBC【3】-- SPI技术使用以及在数据库连接中的使用
目录 1.SPI是什么? 2.如何使用SPI来提供自定义服务? 2.1 DBInterface定义接口 2.2 模拟Mysql实现驱动 2.3 模拟SqlServer实现驱动 2.4 模拟用户使用不同 ...
- linux下安装python3.7.1
一.安装依赖环境 输入命令:yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readlin ...