Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define sc(a) scanf("%d",&a)
- #define scll(a) scanf("%I64d",&a)
- #define scs(a) scanf(" %s",a)
- #define scc(a) scanf(" %c",&a)
- typedef long double ld;
- const int MX = 1e2+6;
- const ld INF = 2e9+5;
- const long long MOD = 1e9+7;
- int n;
- ld w[111],h[111],d[111];
- int k[111];
- ld l,u;
- bool swp(int &x,int &y){swap(x,y);return 1;}
- bool contain(int x,int y)
- {
- if(d[x]<=d[y]&&d[x]+h[x]>=d[y])return 1;
- if(d[x]<=d[y]+h[y]&&d[x]+h[x]>=d[y]+h[y])return 1;
- swap(x,y);
- if(d[x]<=d[y]&&d[x]+h[x]>=d[y])return 1;
- if(d[x]<=d[y]+h[y]&&d[x]+h[x]>=d[y]+h[y])return 1;
- return 0;
- }
- ld seglength(int x,int y)
- {
- ld c=hypot(d[x]+h[x]-d[y],u-w[x]-w[y]);
- swap (x,y);
- c=min(c,hypot(d[x]+h[x]-d[y],u-w[x]-w[y]));
- return c;
- }
- ld f(int x,int y)
- {
- if(k[x]==k[y]||u-w[x]-w[y]<=0)
- {
- if(d[x]<d[y]||swp(x,y))
- {
- return max(d[y]-d[x]-h[x],(ld)0);
- }
- }
- if(contain(x,y)||contain(y,x))
- {
- return max(u-w[x]-w[y],(ld)0);
- }
- return seglength(x,y);
- }
- priority_queue<pair<ld,int>> pq;
- ld dis[MX];
- bool vis[MX];
- void dij()
- {
- memset(vis,0,sizeof vis);
- while(!pq.empty())pq.pop();
- for(int i=0;i<n;i++)
- {
- pq.push({-1*d[i],i});
- dis[i]=d[i];
- }
- while(!pq.empty())
- {
- int nxt=pq.top().second;
- ld odis=-1*pq.top().first;
- // cout<<nxt<<' '<<odis<<endl;
- pq.pop();
- if(vis[nxt])continue;
- vis[nxt]=1;
- for(int i=0;i<n;i++)
- {
- if(i==nxt)continue;
- if(dis[i]<=odis+min(f(i,nxt),f(nxt,i)))continue;
- pq.push({-1*(odis+min(f(i,nxt),f(nxt,i))),i});
- dis[i]=odis+min(f(i,nxt),f(nxt,i));
- }
- }
- }
- int main()
- {
- freopen("street.in","r",stdin);
- int T;
- cin>>T;
- cout<<setprecision(6)<<fixed;
- while(T--)
- {
- cin>>n>>l>>u;
- for(int i=0;i<n;++i)
- {
- cin>>h[i]>>w[i]>>d[i]>>k[i];
- }
- dij();
- ld ans=l;
- //cout<<dis[0]<<endl<<d[0]<<' '<<f(0,0);
- for(int i=0;i<n;i++)
- {
- ans=min(ans,l-h[i]-d[i]+dis[i]);
- }
- cout<<ans<<endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement