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

· · 题解

贪心。

更近的可传点与更远的可传点等价或更优。 每次找到左侧最近的可传点与右侧最近的可传点,与直接走的距离比较即可。 ## 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; } ```