难度:5
知识点:模拟
这是一道大水题,因为洛谷的1367和这道题一模一样,难度标的是3,结果在uva,难度居然是5,就因为题目全是英语,直接提升两个档次?不过这道题有额外一个坑点,就是要longlong,结果超会int,
首先这就是喜闻乐见的蚂蚁题,那么肯定不能一个一个模拟,只能让它们互相穿过去,不然怎么做嘛,输入的时候给出每个蚂蚁的位置,输出的时候要我们还是按照输入的顺序输出每个蚂蚁的位置,有个结论,那就是每个蚂蚁的位置可能会改变,但是它的相对位置不会改变,所以就让每个蚂蚁都无视碰撞规则向前走,然后在按照输入得到的想对位置关系,找它们是拿个蚂蚁,
具体的做法就是输入的时候存一下这个位置是第几号蚂蚁,然后排序,从左到右遍历,开个数组记录一下有序情况下每个位置是输入的第几号蚂蚁,同时模拟蚂蚁向前走,然后接着排序,此时蚂蚁走完,还是有序情况下从前向后遍历,之前开的数组里面记录的就是排名第几的蚂蚁在输入的排名,其实就是记录的下标,开另外一个结构体数组记录一下答案,最后就是遍历输出,输入带输出总共四次循环,好像只能这样做了
还有一点要注意,左端点是0不是1,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define mk make_pair
#define sz(x) ((int) (x).size())
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int N = 1e5 + 5;
struct student {
ll x, r;
char ch;
} stu[N], ans[N];
int Rank[N];
bool cmp(student a, student b) {
return a.x < b.x;
}
int main() {
int tt;
cin >> tt;
int Case = 1;
while (tt--) {
ll l, t;
int n;
cin >> l >> t >> n;
for (int i = 0; i < n; i++) {
cin >> stu[i].x >> stu[i].ch;
stu[i].r = i;
}
sort(stu, stu + n, cmp);
map<ll, int> mp;
for (int i = 0; i < n; i++) {
Rank[i] = stu[i].r;
if (stu[i].ch == 'L') stu[i].x -= t;
if (stu[i].ch == 'R') stu[i].x += t;
if (mp.find(stu[i].x) == mp.end()) mp[stu[i].x] = 1;
else mp[stu[i].x]++;
}
sort(stu, stu + n, cmp);
for (int i = 0; i < n; i++) {
ans[Rank[i]] = stu[i];
}
cout << "Case #" << Case++ << ":\n";
for (int i = 0; i < n; i++) {
if (ans[i].x > l || ans[i].x < 0) cout << "Fell off";
else {
cout << ans[i].x << " ";
if (mp[ans[i].x] == 1) cout << ans[i].ch;
else cout << "Turning";
}
cout << endl;
}
cout << endl;
}
return 0;
}