所有的蚂蚁都可以看作对穿而过且相对位置不变。
#include <cstdio>
#include <algorithm>
const int maxn = 10000 + 10;
struct ant {
int id, pos, dir;
};
ant begin[maxn], end[maxn];
int order[maxn];
bool comp(const ant &a, const ant &b) {
return a.pos < b.pos;
}
int main(int argc, char const *argv[]) {
int T;
scanf("%d", &T);
for (int t = 1; t <= T; t++) {
int l, k, n;
scanf("%d%d%d", &l, &k, &n);
for (int i = 0; i < n; i++) {
int pos;
char c;
scanf("%d%*c%c", &pos, &c);
int dir = (c == 'L') ? -1 : 1;
begin[i].id = i;
begin[i].pos = pos;
begin[i].dir = end[i].dir = dir;
end[i].pos = begin[i].pos + k * dir;
}
std::sort(begin, begin + n, comp);
for (int i = 0; i < n; i++) {
order[begin[i].id] = i;
}
std::sort(end, end + n, comp);
for (int i = 0; i < n - 1; i++) {
if (end[i].pos == end[i+1].pos) {
end[i].dir = end[i+1].dir = 0;
}
}
printf("Case #%d:\n", t);
for (int i = 0; i < n; i++) {
int a = order[i];
if (end[a].pos < 0 || end[a].pos > l) {
puts("Fell off");
} else {
printf("%d ", end[a].pos);
if (end[a].dir == -1) {
puts("L");
} else if (end[a].dir == 1) {
puts("R");
} else {
puts("Turning");
}
}
}
printf("\n");
}
return 0;
}