Submission #1338796

#TimeUsernameProblemLanguageResultExecution timeMemory
1338796athenaCircle Passing (EGOI24_circlepassing)C++20
100 / 100
97 ms8720 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long int
int dist(int a,int b,int n)
{
  return min(abs(a-b),abs(2*n-abs(a-b)));
}
int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n,m,q;
    cin>>n>>m>>q;
    
  //  vector<int> f(2*n,-1);
 //   vector<int> ks(m);
int fri=0;
int mn=1e18,mx=0;
vector<int>vals;
    for(int i=0;i<m;i++) {
        int k;cin>>k;
        vals.push_back(k);
        vals.push_back(k+n);
        mn=min(k,mn);
        mx=max(k,mx);
        //ks[i]=k;//friend having ppl
        //fri=k+n;
       // f[k]=k+n;
        //f[k+n]=k;
    }
    sort(vals.begin(),vals.end());
    while(q--){
        int x,y;
        cin>>x>>y;
        int ans=dist(x,y,n);//direct
        //send to friends
        //using one friend takes us halfway
        //so using 2 friends takes us back to where we came from
        //whats the closest friend to 0 (back and front) (min and max)
        //whats the closest friend for others , upper and lower bound-1 but what about full circle
        //if nothing is less than it , take the greatest
        //if nothing is more than it ,take the smallest
        //for every node can i find closest friend
            //for (int k:ks) {
        auto it=lower_bound(vals.begin(),vals.end(),x);
        int a,b;
        if(it!=vals.end()&&*it==x){
        a=x;
        if(a>=n)b=a-n;
        else
        b=a+n;
        ans=min(ans,1+dist(b,y,n));
        }
        if(it!=vals.begin())
         {
           a=*(it-1);
        } 
        if(it==vals.begin())//non exist
        {
           a=vals.back();//largest
        }
        if(a>=n)b=a-n;
        else
            b=a+n;
           // b=a+n;
            ans=min(ans,dist(x,a,n)+1+dist(b,y,n));
            ans=min(ans,dist(x,b,n)+1+dist(a,y,n));
            
            auto it2=upper_bound(vals.begin(),vals.end(),x);
            if(it2==vals.end())
            {
               a=vals.front();
            }
            else
            {
                a=*it2;
            }
            if(a>=n)b=a-n;
        else
            b=a+n;
            ans=min(ans,dist(x,a,n)+1+dist(b,y,n));
            ans=min(ans,dist(x,b,n)+1+dist(a,y,n));
            //cout<<"___________________________________"<<endl;
               auto it3=lower_bound(vals.begin(),vals.end(),y);
        //int a,b;
        if(it3!=vals.begin())
         {
           a=*(it3-1);
        } 
        if(it3==vals.begin())//non exist
        {
           a=vals.back();//largest
        }
            if(a>=n)b=a-n;
        else
            b=a+n;
            ans=min(ans,dist(x,a,n)+1+dist(b,y,n));
            ans=min(ans,dist(x,b,n)+1+dist(a,y,n));
            
            auto it4=upper_bound(vals.begin(),vals.end(),y);
            if(it4==vals.end())
            {
               a=vals.front();
            }
            else
            {
                a=*it4;
            }
          if(a>=n)b=a-n;
        else
            b=a+n;
            ans=min(ans,dist(x,a,n)+1+dist(b,y,n));
            ans=min(ans,dist(x,b,n)+1+dist(a,y,n));
        //}
        cout<<ans<<endl;
    }
}
#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...