2022春每日一题:Day 23


题目:Piotr's Ants
蚂蚁转头走,其实可以看做他们交换灵魂后接着往前走,同样发现,既然他们的速度相同,那么在数轴上相对位置不会改变(碰面会改变方向),那就好办了。
先把初始状态排序,id都记录下来,再把结束状态排序,对应的l,r,turing标记,然后输出的时候只需要输出结束状态的dy[i]项即可。
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
const int N=1e4+5;
using namespace std;
struct pos
{
int id,p,f;
pos(int ii,int pp,int ff)
{
id=ii;p=pp;f=ff;
}
pos(){
}
friend bool operator < (pos a,pos b)
{
return a.p<b.p;
}
}a[N],b[N];
char out[3][10]={"L","Turning","R"};
int dy[N];
void solve()
{
int l,n,t;
scanf("%d %d %d",&l,&t,&n);
for(int i=1;i<=n;i++)
{
int p;
char op[2];
scanf("%d %s",&p,op);
int kk=op[0]=='L'?-1:1;
a[i]=pos(i,p,kk);
b[i]=pos(i,p+t*kk,kk);
}
sort(a+1,a+1+n);
sort(b+1,b+1+n);
for(int i=1;i<=n;i++)
{
dy[a[i].id]=i;
if(b[i].p==b[i-1].p)
b[i].f=b[i-1].f=0;
}
for(int i=1;i<=n;i++)
{
int now=dy[i];
if(b[now].p<0 || b[now].p>l)
puts("Fell off");
else
printf("%d %s\n",b[now].p,out[b[now].f+1]);
}
puts("");
}
int main()
{
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
printf("Case #%d:\n",i);
solve();
}
return 0;
}

浙公网安备 33010602011771号