gym102920A. Autonomous Vehicle 2020 Asia Seoul Regional Contest

https://codeforces.com/gym/102920/problem/A

考虑到每段路最多被两个方向走两遍,所以只要把每一段路起点终点,时间,方向,转向到哪段路都跑出来就行了,考虑每条线段最多被其他线段分成n段,那么我们最多只需要记录n*n*2段路就行了

最后时间%跑一遍循环的时间然后线性扫一遍

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxl=510;

int n,cnt,tot;ll t;
int nowx,nowy,nowid,nowdir;
struct seg
{
	int bx,by,ex,ey,dir,id;
}a[maxl];
int tx[4]={1,0,-1,0};
int ty[4]={0,1,0,-1};
struct tseg
{
	ll st,et;int sx,sy,ex,ey,dir;
}b[maxl*maxl*4];
map<pair<int,int>,bool> mp[4];
int len[maxl];
struct turn
{
	int frmid,toid,cx,cy;
}e[maxl][maxl];
int exy[maxl][maxl];

inline bool cmpx(const turn &a,const turn &b)
{
	return a.cx<b.cx;
}
inline bool cmpy(const turn &a,const turn &b)
{
	return a.cy<b.cy;
}

inline void prework()
{
	scanf("%d%lld",&n,&t);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d%d",&a[i].bx,&a[i].by,&a[i].ex,&a[i].ey);
		a[i].id=i;
		if(a[i].bx==a[i].ex)
			a[i].dir=1;
		else
			a[i].dir=0;
	}
	nowx=a[1].bx,nowy=a[1].by;nowid=1;nowdir=a[1].dir;
	for(int i=1;i<=n;i++)
		if(a[i].dir==1)
		{
			if(a[i].by>a[i].ey)
			{
				swap(a[i].by,a[i].ey);
				if(i==1) nowdir=(nowdir+2)%4;
			}
		}
		else
		{
			if(a[i].bx>a[i].ex)
			{
				swap(a[i].bx,a[i].ex);
				if(i==1) nowdir=(nowdir+2)%4;
			}
		}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		if(i!=j && a[i].dir!=a[j].dir)
		{
			if(a[i].dir==0)
			{
				if(a[i].bx<=a[j].bx && a[j].bx<=a[i].ex && a[j].by<=a[i].by && a[i].by<=a[j].ey)
					e[i][++len[i]]={i,j,a[j].bx,a[i].by};
			}
			else
			{
				if(a[j].bx<=a[i].bx && a[i].bx<=a[j].ex && a[i].by<=a[j].by && a[j].by<=a[i].ey)
					e[i][++len[i]]={i,j,a[i].bx,a[j].by};
			}
		}
		if(a[i].dir==0)
		{
			sort(e[i]+1,e[i]+1+len[i],cmpx);
			for(int j=1;j<=len[i];j++)
				exy[i][j]=e[i][j].cx;
		}
		else
		{
			sort(e[i]+1,e[i]+1+len[i],cmpy);
			for(int j=1;j<=len[i];j++)
				exy[i][j]=e[i][j].cy;
		}
	}
	/*for(int i=1;i<=n;i++)
	{
		printf("%d:\n",i);
		for(int j=1;j<=len[i];j++)
			printf("%d %d %d %d\n",e[i][j].frmid,e[i][j].toid,e[i][j].cx,e[i][j].cy);
		puts("");
	}*/
}

inline void mainwork()
{
	ll nowt=0;int i=nowid;
	while(1)
	{
		if(mp[nowdir][{nowx,nowy}])
			return;
		mp[nowdir][{nowx,nowy}]=true;
		if(nowdir==0)
		{
			if(len[i]==0 || nowx>=exy[i][len[i]])
			{
				++tot;int len=a[i].ex-nowx;
				b[tot]=tseg{nowt,nowt+len,nowx,nowy,a[i].ex,nowy,0};
				nowx=a[i].ex;nowy=nowy;nowt+=len;i=i;nowdir=2;
			}
			else 
			{
				int nxt=upper_bound(exy[i]+1,exy[i]+1+len[i],nowx)-exy[i];
				++tot;int len=exy[i][nxt]-nowx;
				b[tot]=tseg{nowt,nowt+len,nowx,nowy,exy[i][nxt],nowy,0};
				nowx=exy[i][nxt];nowy=nowy;nowt+=len;i=e[i][nxt].toid;nowdir=1;
			}
		}
		else if(nowdir==1)
		{
			if(len[i]==0 || nowy>=exy[i][len[i]])
			{
				++tot;int len=a[i].ey-nowy;
				b[tot]=tseg{nowt,nowt+len,nowx,nowy,nowx,a[i].ey,1};
				nowx=nowx;nowy=a[i].ey;nowt+=len;i=i;nowdir=3;
			}
			else
			{
				int nxt=upper_bound(exy[i]+1,exy[i]+1+len[i],nowy)-exy[i];
				++tot;int len=exy[i][nxt]-nowy;
				b[tot]=tseg{nowt,nowt+len,nowx,nowy,nowx,exy[i][nxt],1};
				nowx=nowx;nowy=exy[i][nxt];nowt+=len;i=e[i][nxt].toid;nowdir=2;
			}
		}
		else if(nowdir==2)
		{
			if(len[i]==0 || nowx<=exy[i][1])
			{
				++tot;int len=nowx-a[i].bx;
				b[tot]=tseg{nowt,nowt+len,nowx,nowy,a[i].bx,nowy,2};
				nowx=a[i].bx;nowy=nowy;nowt+=len;i=i;nowdir=0;
			}
			else
			{
				int nxt=(lower_bound(exy[i]+1,exy[i]+1+len[i],nowx)-exy[i])-1;
				++tot;int len=nowx-exy[i][nxt];
				b[tot]=tseg{nowt,nowt+len,nowx,nowy,exy[i][nxt],nowy,2};
				nowx=exy[i][nxt];nowy=nowy;nowt+=len;i=e[i][nxt].toid;nowdir=3;
			}
		}
		else
		{
			if(len[i]==0 || nowy<=exy[i][1])
			{
				++tot;int len=nowy-a[i].by;
				b[tot]=tseg{nowt,nowt+len,nowx,nowy,nowx,a[i].by,3};
				nowx=nowx;nowy=a[i].by;nowt+=len;i=i;nowdir=1;
			}
			else
			{
				int nxt=(lower_bound(exy[i]+1,exy[i]+1+len[i],nowy)-exy[i])-1;
				++tot;int len=nowy-exy[i][nxt];
				b[tot]=tseg{nowt,nowt+len,nowx,nowy,nowx,exy[i][nxt],3};
				nowx=nowx;nowy=exy[i][nxt];nowt+=len;i=e[i][nxt].toid;nowdir=0;
			}
		}
	}
}

inline void print()
{
	/*for(int i=1;i<=tot;i++)
		printf("%d: %lld %lld|%d %d->%d %d|%d\n",i,b[i].st,b[i].et,b[i].sx,b[i].sy,b[i].ex,b[i].ey,b[i].dir);
	*/
	t%=b[tot].et;int ansx,ansy;
	for(int i=1;i<=tot;i++)
	if(b[i].st<=t && t<=b[i].et)
	{
		int len=t-b[i].st,dir=b[i].dir;
		ansx=b[i].sx+len*tx[dir],ansy=b[i].sy+len*ty[dir];
		break;
	}
	printf("%d %d\n",ansx,ansy);
	
}

int main()
{
	prework();
	mainwork();
	print();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/114583535
今日推荐