专栏文章

题解:P10848 [EGOI 2024] Circle Passing / 传球游戏

P10848题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mins8877
此快照首次捕获于
2025/12/02 07:30
3 个月前
此快照最后确认于
2025/12/02 07:30
3 个月前
查看原文
贪心。
22 次传球一定是不优的。不如直接走或传 11 次再走。
更近的可传点与更远的可传点等价或更优。
每次找到左侧最近的可传点与右侧最近的可传点,与直接走的距离比较即可。

Code:

CPP
#include<bits/stdc++.h>

using namespace std;

#define ll long long

const int N = 1000050;

int n, m, q, x, y;
int arr[N], iarr[N];

int dis(int a, int b){
	return min(abs(a - b), n * 2 - abs(a - b));
}
int change(int a){
	if(a < n) return a + n;
	return a - n;
}

int main() {
	cin >> n >> m >> q;
	for(int i = 1; i <= m; i ++){
		cin >> arr[i];
		arr[i + m] = arr[i] + n;
	}
	sort(arr + 1, arr + 2 * m + 1);
	for(int i = 1; i <= 2 * m; i ++)
		iarr[i] = -arr[i];
	reverse(iarr + 1, iarr + 2 * m + 1);
	for(int i = 1; i <= q; i ++){
		cin >> x >> y;
		int ne = lower_bound(arr + 1, arr + 2 * m + 1, x) - arr;
		if(ne > 2 * m) ne = 1;
		int la = lower_bound(iarr + 1, iarr + 2 * m + 1, -x) - iarr;
		if(la > 2 * m) la = 1; 
		cout << min({dis(x, y), dis(x, -iarr[la]) + dis(change(-iarr[la]), y) + 1, dis(x, arr[ne]) + dis(change(arr[ne]), y) + 1}) << endl;
	}
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...