碰撞后相当于穿过去,所以结束的位置是可以确定的,又因为相对位置不变,所以可以通过排序确定某个位置是第几只蚂蚁。
#include<iostream> #include<cmath> #include<cstdio> #include<sstream> #include<cstdlib> #include<string> #include<string.h> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<set> #include<stack> #include<list> #include<queue> #include<ctime> #include<bitset> #define eps 1e-6 #define INF 0x3f3f3f3f #define PI acos(-1.0) //#define ll __int64 #define ll long long #define lson l,m,(rt<<1) #define rson m+1,r,(rt<<1)|1 #define M 1000000007 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; int l,t,n; struct node { int id; int st; string dir; }ant[100005],now[100005]; int p[100005]; bool cmp1(node x,node y) { return x.st<y.st; } int main() { int cas,ca=1,n; scanf("%d",&cas); while(cas--) { scanf("%d%d%d",&l,&t,&n); for(int i=0;i<n;i++) { cin>>ant[i].st>>ant[i].dir; ant[i].id=i; now[i].st=ant[i].st+(ant[i].dir=="L"?-1*t:t); now[i].dir=ant[i].dir; } sort(ant,ant+n,cmp1); for(int i=0;i<n;i++) { p[ant[i].id]=i; } sort(now,now+n,cmp1); for(int i=0;i<n-1;i++) { if(now[i].st==now[i+1].st) now[i].dir=now[i+1].dir="Turning"; } printf("Case #%d:\n",ca++); for(int i=0;i<n;i++) { int id=p[i]; if(now[id].st<0||now[id].st>l) puts("Fell off"); else cout<<now[id].st<<" "<<now[id].dir<<endl; } puts(""); } return 0; }