lina_os

Untitled

Feb 6th, 2026 (edited)
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. using ll = int;
  6. using ull = unsigned long long;
  7. using ld = long double;
  8. using vll = vector<ll>;
  9. using pll = pair<ll, ll>;
  10. using mll = map<ll,ll>;
  11. using sll = set<ll>;
  12. #define iv(v) for(auto &i:v) cin >> i
  13. #define ov(v) for(auto &i:v) cout << i << " "
  14. #define all(v) v.begin(), v.end()
  15. #define rall(v) v.rbegin(), v.rend()
  16. #define YES cout << "YES\n"
  17. #define NO  cout << "NO\n"
  18. #define inf  LLONG_MAX
  19. #define pb  push_back
  20.  
  21. #define Bismillah ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
  22.  
  23. const ll MOD = 1e9 + 7;
  24.  
  25. ll add(ll a, ll b) {return ((a % MOD) + (b % MOD)) % MOD;}
  26. ll mul(ll a, ll b) {return ((a % MOD) * (b % MOD)) % MOD;}
  27. ll sub(ll a, ll b) {return (((a - b) % MOD) + MOD) % MOD;}
  28. ll modExp(ll a, ll b) {
  29.     if (b <= 0) return 1;
  30.     ll ret = modExp(a * a % MOD, b / 2);
  31.     if (b % 2) ret = ret * a % MOD;
  32.     return ret;
  33. }
  34. ll inverse(ll b) {return modExp(b, MOD - 2);}
  35. ll divv(ll a, ll b) {return ((a % MOD) * (inverse(b) % MOD)) % MOD;}
  36.  
  37.  
  38. ll dx[]={2,2,-2,-2,1,1,-1,-1};
  39. ll dy[]={1,-1,1,-1,2,-2,2,-2};
  40. bool isValid(ll x, ll y) {
  41.     return x>=0&&y>=0&&x<8&&y<8;
  42. }
  43. ll n,ht,wd;
  44. vector<pll>t; // all nodes
  45. vector<pll>ex;
  46. double dis(ll i, ll j) { // distance calc
  47.     pll a=t[i],b=t[j];
  48.     if(b.first<a.first) swap(a,b);
  49.     auto [d,f]=a;
  50.     auto [dd,ff]=b;
  51.     auto [h,w]=ex[i];
  52.     auto [hh,ww]=ex[j];
  53.     double hdf=dd-d-h;
  54.     if (f==ff || f==2 || ff==2 || w+ww>=wd) return hdf; // on the same side or from start or end
  55.     double wdf=wd-ww-w;
  56.     return sqrt((long long)hdf*(long long)hdf+(long long)wdf*(long long)wdf);
  57. }
  58. void solve() {
  59.     cin >> n >> ht >> wd;
  60.     ex.resize(n+2); // nodes h&w
  61.     t.resize(n+2); // nodes
  62.     vector<double>dist(n+2,1e15);
  63.     for(int i=1; i<=n; i++) {
  64.         ll u,v,d,f;
  65.         cin >> u >> v >> d >> f;
  66.         t[i]={d,f}; //distance,side
  67.         ex[i]={u,v}; // h,w
  68.     }
  69.  
  70.     t[0]={0,2}; t[n+1]={ht,2}; // start and end [side=2]
  71.     ex[0]={0,wd}, ex[n+1]={0,wd};
  72.     priority_queue<pair<double,ll>,vector<pair<double,ll>>,greater<pair<double,ll>>>pq;
  73.     dist[0]=0;
  74.     pq.push({0,0});
  75.     for(int i=1; i<=n; i++) {
  76.         dist[i]=dis(0,i);
  77.         pq.push({dis(0,i),i});
  78.     }
  79.     while(!pq.empty()) {
  80.         auto [d,v]=pq.top();
  81.         pq.pop();
  82.         if(d>dist[v]) continue;
  83.         dist[n+1]=min(dist[n+1],d+dis(v,n+1)); // end update
  84.         for (int j=1; j<=n; j++) {
  85.             if(v!=j) {
  86.                 auto[u,w]= pair<ll,double>{j,dis(v,j)};
  87.                 if(d+w<dist[u]) {
  88.                     dist[u]=d+w;
  89.                     pq.push({d+w,u});
  90.                 }
  91.             }
  92.         }
  93.     }
  94.     cout << fixed << setprecision(6) << dist[n+1] << endl;
  95. }
  96. int main() {
  97.     Bismillah
  98. //    freopen("street.in", "r", stdin);
  99.     ll ts=1;
  100.     cin >> ts;
  101.     while (ts--) {
  102.         solve();
  103.     }
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment