ARC152B-Pass-on-Path题解

题目传送门

题意:有一个 \([0,L]\) 的数轴,分布有 \(n\) 个休息站,每个休息站坐标为 \(a_i\)。A、B 两人速度均为 \(1\),他们分别从某个休息站开始,向某个方向走,每人都遍历完两个端点后回到原地。两人只有在休息站才能交错,而不能在路上穿过。求最小时间。

首先发现一个性质:AB 一定会交错两次,总时间即为 \(2L+\max(wait_A,wait_B)\),其中 \(wait_A,wait_B\) 分别表示 AB 等待的时间。由于前者为定值,所以可以推出一个结论为,AB 的起点一定相同。于是对于每个起点,我们只需要找出 AB 两人等待时间最短的“第二次交错位置”即可。由于等待的时间即为 AB 路径长度的差,所以一定要求最接近,可以使用双指针或 lower_bound 计算。

By Um_nik

const ll INF = (ll)1e12;
const int N = 500500;
int n;
ll L;
ll a[N];
ll ans = INF;

int main()
{
	startTime = clock();
//	freopen("input.txt", "r", stdin);
//	freopen("output.txt", "w", stdout);

	scanf("%d%lld", &n, &L);
	for (int i = 0; i < n; i++)
		scanf("%lld", &a[i]);
	sort(a, a + n);
	int p = 0, q = n - 1;
	while(p < n && q >= 0) {
		ans = min(ans, abs(a[p] + a[q] - L));
		if (a[p] + a[q] >= L)
			q--;
		else
			p++;
	}
	printf("%lld\n", 2 * L + 2 * ans);

	return 0;
}
posted @ 2023-03-01 16:07  曹轩鸣  阅读(21)  评论(0编辑  收藏  举报