AtCoder Grand Contest 013 C Ants on a Circle 模擬

Description


一個周長爲L的圓上有n個螞蟻,每個螞蟻有一個初始方向(順/逆時針),每隻螞蟻在一單位時間內可以爬行一單位距離,兩隻螞蟻相遇後各自調轉方向繼續爬,問T時間後每個螞蟻的位置
n105,L,T109n\le 10^5,\\ L,T\le10^9

Solution


由於每隻螞蟻都是等價的,我們把調轉方向看成是交換編號然後繼續按原來的方向走
一個比較重要的結論就是螞蟻的相對順序是不變的,那麼我們只需要找出第一隻螞蟻的最後排位然後排序就可以了
考慮什麼時候第一隻螞蟻編號發生變化,有一隻從0走到L-1,有一隻從L-1走到0
我們討論一下就可以了

Code


#include <stdio.h>
#include <string.h>
#include <algorithm>
#define rep(i,st,ed) for (int i=st;i<=ed;++i)

const int N=200005;

int a[N];

int read() {
	int x=0,v=1; char ch=getchar();
	for (;ch<'0'||ch>'9';v=(ch=='-')?(-1):(v),ch=getchar());
	for (;ch<='9'&&ch>='0';x=x*10+ch-'0',ch=getchar());
	return x*v;
}

int main(void) {
	int n=read(),m=read(),T=read();
	int id=0;
	rep(i,0,n-1) {
		int x=read(),w=read();
		if (w==1) {
			id+=(x+T)/m;
			a[i]=(x+T)%m;
		} else {
			if ((x-T)%m<0) {
				a[i]=(x-T)%m+m;
				id+=(x-T)/m-1;
			} else {
				a[i]=(x-T)%m;
				id+=(x-T)/m;
			}
		}
	}
	std:: sort(a,a+n);
	id=(id%n+n)%n;
	rep(i,id,n-1) printf("%d\n", a[i]);
	rep(i,0,id-1) printf("%d\n", a[i]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章