下笔春蚕食叶声。

[AGC013C] Ants on a Circle 思维题

https://atcoder.jp/contests/agc013/tasks/agc013_c?lang=en

考虑到原来每只蚂蚁都在相邻之间撞来撞去,所以肯定最后每只蚂蚁的相对顺序是不会改变的。显然可以直接确定最后位置的整个序列,只要确定第一只蚂蚁在序列的位置(最终编号),就可以知道每只蚂蚁最后实际的位置。

不妨想象成蚂蚁相撞,蚂蚁相互穿过,编号交换。\(i\) 号蚂蚁的实际位置应当在拥有 \(i\) 编号的蚂蚁的位置。

考虑在直线上的情况,直接对应就行了。但现在是在环上,如果有一只蚂蚁逆时针经过0,那么1号蚂蚁最后的位置就会向前一位,顺时针则会向后一位。(想象成这只蚂蚁变成了负数,那么在直线上,他应该是最前面的,但先在在环上,所以他穿过去了,就会变成最后面的,所以原来在他后面的都会往前挪一位)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n, l, t, ans[N]; 
int main() {
	scanf("%d%d%d", &n, &l, &t);
	int cnt = 0;
	for(int i = 0, x, w; i < n; i++){
		scanf("%d%d", &x, &w);
		x += ((w == 1) ? t : -t);
		cnt = ((cnt + (int)floor(1.0 * x / l)) % n + n) % n; 
		ans[i] = (x % l + l) % l;
	}
	sort(ans, ans + n);
	for(int i = 0; i < n; i++)
		printf("%d\n", ans[(cnt + i) % n]); 
	return 0;
}
posted @ 2021-09-06 16:23  ACwisher  阅读(50)  评论(0编辑  收藏  举报