Submission #1168397

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

int n, m, q;
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 = (r+l)/2;
        // cout << l << " " << r << " " << mid << endl;

        if(bridge.at(mid) > x){
            r = mid;
            // cout << "HERE1\n";
        }else if(bridge.at(mid) < x){
            l = mid;
            // cout << "HERE2\n";
        }else if(bridge.at(mid) == x){
            return {mid, mid};
            // cout << "HERE3\n";
        }

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

    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;

        int brute = getDist(x, y);

        pair<int, int> b = getIdx(x);
        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...