Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- using ll = int;
- using ull = unsigned long long;
- using ld = long double;
- using vll = vector<ll>;
- using pll = pair<ll, ll>;
- using mll = map<ll,ll>;
- using sll = set<ll>;
- #define iv(v) for(auto &i:v) cin >> i
- #define ov(v) for(auto &i:v) cout << i << " "
- #define all(v) v.begin(), v.end()
- #define rall(v) v.rbegin(), v.rend()
- #define YES cout << "YES\n"
- #define NO cout << "NO\n"
- #define inf LLONG_MAX
- #define pb push_back
- #define Bismillah ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
- const ll MOD = 1e9 + 7;
- ll add(ll a, ll b) {return ((a % MOD) + (b % MOD)) % MOD;}
- ll mul(ll a, ll b) {return ((a % MOD) * (b % MOD)) % MOD;}
- ll sub(ll a, ll b) {return (((a - b) % MOD) + MOD) % MOD;}
- ll modExp(ll a, ll b) {
- if (b <= 0) return 1;
- ll ret = modExp(a * a % MOD, b / 2);
- if (b % 2) ret = ret * a % MOD;
- return ret;
- }
- ll inverse(ll b) {return modExp(b, MOD - 2);}
- ll divv(ll a, ll b) {return ((a % MOD) * (inverse(b) % MOD)) % MOD;}
- ll dx[]={2,2,-2,-2,1,1,-1,-1};
- ll dy[]={1,-1,1,-1,2,-2,2,-2};
- bool isValid(ll x, ll y) {
- return x>=0&&y>=0&&x<8&&y<8;
- }
- ll n,ht,wd;
- vector<pll>t; // all nodes
- vector<pll>ex;
- double dis(ll i, ll j) { // distance calc
- pll a=t[i],b=t[j];
- if(b.first<a.first) swap(a,b);
- auto [d,f]=a;
- auto [dd,ff]=b;
- auto [h,w]=ex[i];
- auto [hh,ww]=ex[j];
- double hdf=dd-d-h;
- if (f==ff || f==2 || ff==2 || w+ww>=wd) return hdf; // on the same side or from start or end
- double wdf=wd-ww-w;
- return sqrt((long long)hdf*(long long)hdf+(long long)wdf*(long long)wdf);
- }
- void solve() {
- cin >> n >> ht >> wd;
- ex.resize(n+2); // nodes h&w
- t.resize(n+2); // nodes
- vector<double>dist(n+2,1e15);
- for(int i=1; i<=n; i++) {
- ll u,v,d,f;
- cin >> u >> v >> d >> f;
- t[i]={d,f}; //distance,side
- ex[i]={u,v}; // h,w
- }
- t[0]={0,2}; t[n+1]={ht,2}; // start and end [side=2]
- ex[0]={0,wd}, ex[n+1]={0,wd};
- priority_queue<pair<double,ll>,vector<pair<double,ll>>,greater<pair<double,ll>>>pq;
- dist[0]=0;
- pq.push({0,0});
- for(int i=1; i<=n; i++) {
- dist[i]=dis(0,i);
- pq.push({dis(0,i),i});
- }
- while(!pq.empty()) {
- auto [d,v]=pq.top();
- pq.pop();
- if(d>dist[v]) continue;
- dist[n+1]=min(dist[n+1],d+dis(v,n+1)); // end update
- for (int j=1; j<=n; j++) {
- if(v!=j) {
- auto[u,w]= pair<ll,double>{j,dis(v,j)};
- if(d+w<dist[u]) {
- dist[u]=d+w;
- pq.push({d+w,u});
- }
- }
- }
- }
- cout << fixed << setprecision(6) << dist[n+1] << endl;
- }
- int main() {
- Bismillah
- // freopen("street.in", "r", stdin);
- ll ts=1;
- cin >> ts;
- while (ts--) {
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment