Submission #1168240

#TimeUsernameProblemLanguageResultExecution timeMemory
1168240SheepHeadsCircle Passing (EGOI24_circlepassing)C++20
31 / 100
2096 ms8276 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

int n, m, q;
const int INF = 1e9+7;
vector<int> bridge;

int getDist(int x, int y){
    if(x < n){
        return min(abs(y-x), x+2*n-y);
    }else{
        return min(abs(y-x), 2*n-x+y);
    }
}

pair<int, int> getIdx(int x){
    if(x < bridge.at(0) || x > bridge.at(2*m-1)){
        return {0, 2*m-1};
    }else if(x == bridge.at(0)){
        return {0, 0};
    }else if(x == bridge.at(2*m-1)){
        return {2*m-1, 2*m-1};
    }

    int l = 0;
    int r = 2*m-1;

    while(l < r){
        int mid = (l + ((r-l)>>1));

        if(bridge.at(mid) > x){
            r = mid;
        }else if(bridge.at(mid) < x){
            l = mid;
        }else if(bridge.at(l) == x){
            return {l, l};
        }else if(bridge.at(r) == x){
            return {r, r};
        }

        if(abs(r-l) < 2){
            return {min(r, l), max(r, l)};
        }
    }

    return {min(r, l), max(r, l)};
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m>>q;
    bridge = vector<int>(2*m);

    for(int i = 0; i<m; i++){
        cin>>bridge.at(i);
        bridge.at(i+m) = bridge.at(i)+n;
    }
    
    // for(auto itr : bridge){
    //     cout << itr << "\n";
    // }

    while(q--){
        int x, y;
        cin>>x>>y;

        pair<int, int> b = getIdx(x);
        int brute = getDist(x, y);
        int f = getDist(x, bridge.at(b.first)) + getDist(y, bridge.at((b.first+m)%(2*m)))+1;
        int s = getDist(x, bridge.at(b.second)) + getDist(y, bridge.at((b.second+m)%(2*m)))+1;

        // cout << brute << " " << f << " " << s << "\n";

        cout << min(brute, min(f, s)) << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...