专栏文章
题解:P10848 [EGOI 2024] Circle Passing / 传球游戏
P10848题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mins8877
- 此快照首次捕获于
- 2025/12/02 07:30 3 个月前
- 此快照最后确认于
- 2025/12/02 07:30 3 个月前
贪心。
次传球一定是不优的。不如直接走或传 次再走。
更近的可传点与更远的可传点等价或更优。
每次找到左侧最近的可传点与右侧最近的可传点,与直接走的距离比较即可。
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 条评论,欢迎与作者交流。
正在加载评论...