Description
一個周長爲L的圓上有n個螞蟻,每個螞蟻有一個初始方向(順/逆時針),每隻螞蟻在一單位時間內可以爬行一單位距離,兩隻螞蟻相遇後各自調轉方向繼續爬,問T時間後每個螞蟻的位置
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;
}