QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#170736 | #7184. Transport Pluses | ucup-team994# | WA | 1ms | 3708kb | C++14 | 3.9kb | 2023-09-09 15:51:53 | 2023-09-09 15:54:13 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
#define rep(i,x,n) for(int i=x;i<=n;i++)
#define x first
#define y second
# define pii pair<int,int>
const int N=2e5+10;
using namespace std;
int t,n,x,mx;
pii s,e;
pair<pii,int> q[N];
void ww(int x)
{
cout << "part-" << x << "\n";
}
main()
{
ios::sync_with_stdio(0);cin.tie(0);
// cout << fixed << setpresicion(10) << ;
cin >> n >> t;
cin >> s.x >> s.y >> e.x >> e.y;
rep(i,0,n-1) cin >> q[i].x.x >> q[i].x.y,q[i].y=i;
sort(q,q+n);
pair<pii,int> ps=q[0],pe=q[0];//距离s和e最近的十字
double ls=min(abs(s.x-q[0].x.x),abs(s.y-q[0].x.y)),le=min(abs(e.x-q[0].x.x),abs(e.y-q[0].x.y));
rep(i,0,n-1)//找距离最近的十字
{
int ds,de;
pii ns=s,ne=e,nq=q[i].x; //距离s和e的最近距离
ds=min(abs(ns.x-nq.x),abs(ns.y-nq.y));
de=min(abs(ne.x-nq.x),abs(ne.y-nq.y));
if(ds<ls)//更新最近距离和点
{
ls=ds;
ps=q[i];
}
if(de<le)//更新最近距离和点
{
le=de;
pe=q[i];
}
}
if(s==e)//s和e位置相同直接输出0
{
// ww(1);
cout << 0 << "\n";
cout << 1 << "\n";
cout << 0 << " " << e.x << " " << e.y << "\n";
}
else if((s.x-e.x==0||s.y-e.y==0)&&
((ps.x.x==s.x&&ps.x.x==e.x)||(ps.x.x==s.x&&ps.x.y==e.y)||(ps.x.y==s.y&&ps.x.x==e.x)||(ps.x.y==s.y&&ps.x.y==e.y))||
((pe.x.x==s.x&&pe.x.x==e.x)||(pe.x.x==s.x&&pe.x.y==e.y)||(pe.x.y==s.y&&pe.x.x==e.x)||(pe.x.y==s.y&&pe.x.y==e.y))
)//s和e同一横纵坐标且被同一个航线支配(被支配也就是距离为0且支配点层面相同)
{
// ww(2);
int k=((ps.x.x-s.x==0||ps.x.x-s.y==0)||(ps.x.y-e.x==0||ps.x.y-e.y==0))?ps.y:pe.y;//序号
double dse=sqrt((s.x-e.x)*(s.x-e.x)+(s.y-e.y)*(s.y-e.y));//直接飞的距离
if(dse<=t)
{
cout << fixed << setprecision(10) << dse << "\n";
cout << 1 << "\n";
cout << 0 << " " << e.x << " " << e.y << "\n";
}
else
{
cout << fixed << setprecision(10) << t << "\n";
cout << 1 << "\n";
cout << k+1 << " " << e.x << " " << e.y << "\n";
}
}
else
{
// ww(3);
double ans1=sqrt((s.x-e.x)*(s.x-e.x)+(s.y-e.y)*(s.y-e.y));//不支配航站的情况
double ans2=t+min(abs(s.x-e.x),abs(s.y-e.y));//支配一个航站的情况
//以下是支配两个航站的情况
//先计算航站费用 2*t ,再计算最近距离即可,
double ans3=2*t+ls+le;
ans2=500;
//计算有没有在其中的点
int kx=-1,ky=-1,lx=0x3f3f3f3f,ly=0x3f3f3f3f;
rep(i,0,n-1)
{
int ok=0;
if( (q[i].x.x-s.x)*(q[i].x.x-e.x)<=0 && lx > t+abs(s.x-e.x))
{
lx=t+abs(s.x-e.x);
kx=i;
ok=1;
}
if( (q[i].x.y-s.y)*(q[i].x.y-e.y)<=0 && ly > t+abs(s.y-e.y))
{
lx=t+abs(s.y-e.y);
ky=i;
ok=1;
}
if(ok) break;
}
ans2=min(lx,ly);
double ans = min({ans1,ans2,ans3});
cout << fixed << setprecision(10) <<ans << "\n";
if(ans==ans1)
{
cout << 0 << "\n";
}
else if(ans==ans3)
{
// ww(4);
int rm = 1;//如果终点就在线上,那就不用加,否则要加
if(pe.x.x==e.x||pe.x.y==e.y) rm=0;
cout << 2+rm << "\n";
cout << ps.y+1 << " " << ps.x.x << " " << ps.x.y << "\n";
if(rm)
{
cout << pe.y+1 << " " << pe.x.x << " " << pe.x.y << "\n";
cout << 0 << " " << e.x << " " << e.y << "\n";
}
else
{
cout << pe.y+1 << " " << e.x << " " << e.y << "\n";
}
}
else//需要有线在s和e之间才可以
{
// ww(5);
cout << 3 << "\n";
pii c=((kx<0||lx>ly)?q[ky].x:q[kx].x);
cout << 0 << " " << ((kx<0||lx>ly)?s.x:c.x) << " " << ((kx<0||lx>ly)?c.y:s.y) << "\n";
cout << q[(kx<0||lx>ly)?ky:kx].y+1 << " " << ((kx<0||lx>ly)?e.x:c.x) << " " << ((kx<0||lx>ly)?c.y:e.y) << "\n";
cout << 0 << " " << e.x << " " << e.y << "\n";
}
}
}
/*
0步抵达
1 2
0 0
0 0
1 1
1步抵达(共支配点)
3 2
0 0
3 0
1 1
2 2
8 0
3步或更少抵达
不支配航站
支配一个航站
支配两个航站
*/
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3596kb
input:
1 2 1 1 5 3 6 2
output:
4.0000000000 3 0 1 2 1 5 2 0 5 3
result:
ok correct
Test #2:
score: 0
Accepted
time: 1ms
memory: 3708kb
input:
2 1 1 1 6 1 1 3 6 3
output:
2.0000000000 2 1 1 3 2 6 1
result:
ok correct
Test #3:
score: 0
Accepted
time: 0ms
memory: 3444kb
input:
0 0 1 1 1 1
output:
0 1 0 1 1
result:
ok correct
Test #4:
score: -100
Wrong Answer
time: 1ms
memory: 3596kb
input:
0 0 100 100 0 0
output:
100.0000000000 2 1 0 0 1 0 0
result:
wrong answer Integer 1 violates the range [0, 0]