Submission #1301757

#TimeUsernameProblemLanguageResultExecution timeMemory
1301757rana_azkaCircle Passing (EGOI24_circlepassing)C++20
31 / 100
434 ms71004 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int INF = 1e18;
const int MOD = 1e9+7;
const int MAXN = 1e5;

int n, m, q;
vector<int> punyaBF;
map<int, int> BF;

void mulaidarinol(){}

int getDist(int a, int b){
    if(a > b) swap(a, b);

    int ret = min(b - a, (2*n) - b + a);
    return ret;
}

void solve(){
    cin >> n >> m >> q;
    for(int i = 1; i <= m; i++){
        int x; cin >> x;
        punyaBF.push_back(x);
        punyaBF.push_back(x+n);
        BF[x] = x+n;
        BF[x+n] = x;
    }

    sort(punyaBF.begin(), punyaBF.end());
    reverse(punyaBF.begin(), punyaBF.end());
    punyaBF.push_back(punyaBF[0]);
    reverse(punyaBF.begin(), punyaBF.end());

    while(q--){
        int start, finish; cin >> start >> finish;

        int ans = getDist(start, finish);

        // LEBIH KECIL
        int idx = 0;
        int left = 1, right = 2*m;
        int mid;
        while(left <= right){
            mid = (left + right) / 2;
            if(punyaBF[mid] <= start){
                idx = mid;
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }

        int temp = getDist(start, punyaBF[idx]) + 1 + getDist(BF[punyaBF[idx]], finish);
        ans = min(temp, ans);

        // LEBIH BESAR
        idx = 0;
        left = 1; right = 2*m;
        mid = 0;
        while(left <= right){
            mid = (left + right) / 2;
            if(punyaBF[mid] >= start){
                idx = mid;
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }

        temp = getDist(start, punyaBF[idx]) + 1 + getDist(BF[punyaBF[idx]], finish);
        ans = min(temp, ans);

        cerr << "=> ";
        cout << ans << endl;
    }
}

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

    int tc = 1;
    // cin >> tc;
    while(tc--){
        // mulaidarinol();
        solve();
    }

    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...