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] << " ";

}