QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#170736#7184. Transport Plusesucup-team994#WA 1ms3708kbC++143.9kb2023-09-09 15:51:532023-09-09 15:54:13

Judging History

你现在查看的是最新测评结果

  • [2023-09-09 15:54:13]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3708kb
  • [2023-09-09 15:51:53]
  • 提交

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]