csp 14-2 学生排队
题意以及思路
本题让我们维护学生编号与学生位置的关系。
本题的数据范围n与m都是1000,所以时间复杂度只要控制在nm就可以,这样就轻松了。
那么可以考虑使用数组来维护这种关系。因为每一次调换位置都是对学生的操做,所以可以使用数组下标表示学生编号,对每一次调换操做改变移动范围内的学生的位置。
代码实现
#include<iostream>
using namespace std;
const int maxn = 1005;
int pos[maxn];
int n, m;
void mov(int l, int r, int d) {
for (int i = 1; i <= n; i++) {
if (pos[i] >= l && pos[i] <= r) pos[i] += d;
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
pos[i] = i;
}
for (int i = 0; i < m; i++) {
int p, s;
cin >> p >> s;
int at = pos[p];
s = min(n - at, s);
s = max(1 - at, s);
if (s > 0) {
int l = at + 1;
int r = at + s;
mov(l, r, -1);
pos[p] = at + s;
}
if (s < 0) {
int l = at + s;
int r = at - 1;
mov(l, r, 1);
pos[p] = at + s;
}
}
int ans[maxn];
for (int i = 1; i <= n; i++) {
ans[pos[i]] = i;
}
for (int i = 1; i <= n; i++) cout << ans[i] << " ";
}