Advertisement
Guest User

magicalPillar.cpp

a guest
Oct 15th, 2020
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. // macros
  5. typedef long long ll;
  6. typedef long double ld;
  7. typedef pair<int, int> ii;
  8. typedef pair<ll, ll> lll;
  9. typedef tuple<ll, ll, ll> llll;
  10. typedef tuple<int, int, int> iii;
  11. typedef vector<int> vi;
  12. typedef vector<ii> vii;
  13. typedef vector<iii> viii;
  14. typedef vector<ll> vll;
  15. typedef vector<lll> vlll;
  16. #define REP(a,b,c) for(int a=int(b); a<int(c); a++)
  17. #define RE(a,c) REP(a,0,c)
  18. #define RE1(a,c) REP(a,1,c+1)
  19. #define REI(a,b,c) REP(a,b,c+1)
  20. #define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
  21. #define FOR(a,b) for(auto& a : b)
  22. #define all(a) a.begin(), a.end()
  23. #define INF 1e18
  24. #define EPS 1e-9
  25. #define pb push_back
  26. #define popb pop_back
  27. #define fi first
  28. #define se second
  29. #define sz size()
  30. mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
  31.  
  32. // input
  33. template<class T> void IN(T& x) {cin >> x;}
  34. template<class H, class... T> void IN(H& h, T&... t) {IN(h); IN(t...); }
  35.  
  36. // output
  37. template<class T1, class T2> void OUT(const pair<T1,T2>& x);
  38. template<class T> void OUT(const vector<T>& x);
  39. template<class T> void OUT(const T& x) {cout << x;}
  40. template<class H, class... T> void OUT(const H& h, const T&... t) {OUT(h); OUT(t...); }
  41. template<class T1, class T2> void OUT(const pair<T1,T2>& x) {OUT(x.fi,' ',x.se);}
  42. template<class T> void OUT(const vector<T>& x) {RE(i,x.size()) OUT(i==0?"":" ",x[i]);}
  43. template<class... T> void OUTL(const T&... t) {OUT(t..., "\n"); }
  44. template<class H> void OUTLS(const H& h) {OUTL(h); }
  45. template<class H, class... T> void OUTLS(const H& h, const T&... t) {OUT(h,' '); OUTLS(t...); }
  46.  
  47. void program();
  48. int main() {
  49.     ios_base::sync_with_stdio(false);
  50.     cin.tie(NULL);
  51.     cout.tie(NULL);
  52.     program();
  53. }
  54.  
  55.  
  56. //===================//
  57. //   begin program   //
  58. //===================//
  59.  
  60. const int MX = 5e5;
  61.  
  62. int n;
  63. ll xs, ys, xf, yf;
  64. ll X[MX], Y[MX], R[MX], C[MX];
  65. vlll adj[MX];
  66. ll dist[MX];
  67.  
  68. void program() {
  69.     IN(n,xs,ys,xf,yf);
  70.     RE(i,n) IN(X[i], Y[i], R[i], C[i]);
  71.     X[n]=xs, Y[n]=ys, R[n]=0, C[n]=INF; n++;
  72.     X[n]=xf, Y[n]=yf, R[n]=0, C[n]=0  ; n++;
  73.  
  74.     // horizontal graph
  75.     {
  76.         priority_queue<llll> pq;
  77.         RE(i,n) {
  78.             pq.push({Y[i]+R[i],2,i});
  79.             pq.push({Y[i]-R[i],1,i});
  80.         }
  81.  
  82.         ll inside = 0, last = 0;
  83.         while(!pq.empty()) {
  84.             ll y, typ, i;
  85.             tie(y,typ,i) = pq.top(); pq.pop();
  86.             if(typ == 2) {
  87.                 // create
  88.                 if(inside) {
  89.                     adj[i   ].pb({last,0});
  90.                     adj[last].pb({i   ,0});
  91.                 }
  92.                 inside++;
  93.                 last = i;
  94.             } else {
  95.                 // destroy
  96.                 inside--;
  97.             }
  98.         }
  99.     }
  100.  
  101.     // vertical graph
  102.     {
  103.         priority_queue<llll> pq;
  104.         RE(i,n) {
  105.             pq.push({X[i]+R[i],2,i});
  106.             pq.push({X[i]-R[i],1,i});
  107.         }
  108.  
  109.         ll inside = 0, last = 0;
  110.         while(!pq.empty()) {
  111.             ll x, typ, i;
  112.             tie(x,typ,i) = pq.top(); pq.pop();
  113.             if(typ == 2) {
  114.                 // create
  115.                 if(inside) {
  116.                     adj[i   +n].pb({last+n,0});
  117.                     adj[last+n].pb({i   +n,0});
  118.                 }
  119.                 inside++;
  120.                 last = i;
  121.             } else {
  122.                 // destroy
  123.                 inside--;
  124.             }
  125.         }
  126.     }
  127.  
  128.     RE(i,n) {
  129.         adj[i  ].pb({i+n, C[i]});
  130.         adj[i+n].pb({i  , C[i]});
  131.     }
  132.  
  133.     // dijkstra
  134.     RE(i,n*2) dist[i] = INF;
  135.     priority_queue<lll,vlll,greater<lll>> pq;
  136.     pq.push({0,n-2}); dist[n-2] = 0;
  137.     while(!pq.empty()) {
  138.         lll p = pq.top(); pq.pop();
  139.         if(dist[p.se] != p.fi) continue;
  140.         if(p.se == n-1) break;
  141.         FOR(v,adj[p.se]) {
  142.             if(p.fi+v.se < dist[v.fi]) {
  143.                 dist[v.fi] = p.fi+v.se;
  144.                 pq.push({dist[v.fi], v.fi});
  145.             }
  146.         }
  147.     }
  148.  
  149.     if(dist[n-1] == INF) dist[n-1] = -1;
  150.  
  151.     OUTL(dist[n-1]);
  152. }
  153.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement