【题解】「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\) 个小 ...
 
随机推荐
- nginx&http 第三章 ngx 事件event epoll 处理
			
1. epoll模块命令集 ngx_epoll_commands epoll模块上下文 ngx_epoll_module_ctx epoll模块配置 ngx_epoll_module static ...
 - Netlink 内核实现分析 3
			
Netlink IPC 数据结构 #define NETLINK_ROUTE 0 /* Routing/device hook */ #define NETLINK_UNUSED 1 /* Unuse ...
 - 451. Sort Characters By Frequency(桶排序)
			
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
 - centos 新装的常见问题
			
1.没有1080分辨率 vi /etc/X11/xorg.conf Section "Monitor" Identifier "Monitor0" Vendor ...
 - linux系统克隆系统盘
			
本文将介绍两种方式的系统盘的完整的备份,两种方式各有优缺点,需要根据实际情况来进行选择 使用dd的完整镜像克隆的方式 使用tar去备份数据,安装grub的方式 dd方式 优点: 简单,一条命令 dd ...
 - [LeetCode题解]86. 分隔链表 | 三指针 + 虚拟头节点
			
解题思路 三指针,一个指向前半部分待插入位置,一个指向后半部分待插入位置,最后一个从前往后遍历 代码 /** * Definition for singly-linked list. * public ...
 - 12种不宜使用的Javascript语法 ---阮一峰
			
原文链接-阮一峰博客 1. == Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前一组,永远只 ...
 - 深度分析:Java多线程,线程安全,并发包
			
1:synchronized(保证原子性和可见性) 1.同步锁.多线程同时访问时,同一时刻只能有一个线程能够访问使synchronized修饰的代码块或方法.它修饰的对象有以下几种: 修饰一个代码块, ...
 - 苹果电脑下载电影教程:如何用folx下载《小妇人》
			
由西尔莎罗南.艾玛沃特森等知名影星重新演绎的<小妇人>又带动了新一轮的<小妇人>热潮.这部由露易莎创作的长篇小说,曾被多次拍摄,无论是小说本身,还是其影视资源,都能让观众回味无 ...
 - 快来,Boom 3D广播功能还能这样用
			
Boom 3D不仅为用户提供了包括3D立体音效.古典音乐音效在内的多种音效增强功能,而且还为用户提供了广播功能.该广播功能不仅涵盖了国内广播节目,而且还涵盖了国际广播节目. Boom 3D的广播功能还 ...