Submission #1167356

#TimeUsernameProblemLanguageResultExecution timeMemory
1167356WH8Circle Passing (EGOI24_circlepassing)C++20
14 / 100
134 ms8684 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define g0(x) get<0>(x) #define g1(x) get<1>(x) #define g2(x) get<2>(x) #define pb push_back #define int long long #define f first #define s second #define pll pair<long long, long long> int n; int dist(int a, int b){ return min(abs(a-b), 2*n-abs(a-b)); } signed main(){ int m,q;cin>>n>>m>>q; vector<int> v; for(int i=0;i<m;i++){ int c;cin>>c; v.pb(c); v.pb(c+n); } sort(v.begin(),v.end()); for(int i=0;i<q;i++){ int x,y;cin>>x>>y; if(x<y)swap(x,y); int cand=dist(x,y); //~ printf("straight is %lld\n", cand); //~ int xp=(x+(n+1)/2+(n%2==0?1:0))%(2*n), xm=(x-(n+1)/2+(n%2==0?-1:0) + 2*n)%(2*n); int yp=(y+(n/2)+(n%2==0?-1:0))%(2*n), ym=(y-(n/2)+(n%2==0?1:0) + 2*n)%(2*n); vector<int>::iterator it; //~ printf("bounds are ym %lld to yp %lld \n", ym, yp); if(yp<ym){ it=lower_bound(v.begin(),v.end(),ym); if(it!=v.end()){ int a=(*it), b=(a+n)%(2*n); int pos=min(dist(x,a)+1+dist(y,b), dist(x,b)+1+dist(y,a)); cand=min({cand, pos}); } it=upper_bound(v.begin(),v.end(),yp); if(it!=v.begin()){ int a=(*prev(it)), b=(a+n)%(2*n); int pos=min(dist(x,a)+1+dist(y,b), dist(x,b)+1+dist(y,a)); cand=min({cand, pos}); } it=v.begin(); if(it!=v.end() and (*it)<=yp){ int a=(*it), b=(a+n)%(2*n); int pos=min(dist(x,a)+1+dist(y,b), dist(x,b)+1+dist(y,a)); cand=min({cand, pos}); } it=prev(v.end()); if(it!=v.begin() and (*prev(it))>=ym){ int a=(*prev(it)), b=(a+n)%(2*n); int pos=min(dist(x,a)+1+dist(y,b), dist(x,b)+1+dist(y,a)); cand=min({cand, pos}); } } else{ it=lower_bound(v.begin(),v.end(),ym); if(it!=v.end() and (*it)<=yp){ int a=(*it), b=(a+n)%(2*n); //~ printf("one way is %lld, other way is %lld\n", dist(x,a)+1+dist(y,b), dist(x,b)+1+dist(y,b)); int pos=min(dist(x,a)+1+dist(y,b), dist(x,b)+1+dist(y,a)); cand=min({cand, pos}); //~ printf("a is %lld, b is %lld, pos is %lld \n", a, b,pos); } it=upper_bound(v.begin(),v.end(),yp); if(it!=v.begin() and (*prev(it))>=ym){ int a=(*prev(it)), b=(a+n)%(2*n); int pos=min(dist(x,a)+1+dist(y,b), dist(x,b)+1+dist(y,a)); cand=min({cand, pos}); } } cout<<cand<<endl; //~ int lb=xp, ub=yp; //~ if(dist(xm,ym)<dist(xp,yp)){ //~ lb=xm,ub=ym; //~ } //~ printf("bounds are %lld to %lld\n", lb, ub); //~ int a=-1, b=-1; //~ if(lb>ub){ //~ } //~ else{ //~ } //~ auto it=lower_bound(v.begin(),v.end(),xp); //~ if(it!=v.end() and (*it)<=yp){ //~ int a=(*it), b=((*it)+n)%(2*n); //~ int cand=min(dist(x,a)+1+dist(y,b), dist(x,b)+1+dist(y,b)); //~ printf("cand is %lld\n", cand); //~ ans=min(ans,cand); //~ } //~ 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...