AGC013C. Ants on a Circle
太摆了!不能摆了!不会写题!来写博客!
首先套路的,蚂蚁相遇时我们可以看作他们的编号交换后继续往前走,可以求出最后的所有位置。同时,显然最早和最后的对应蚂蚁的相对顺序是不变的——假如这是一条直线的话,我们已经做完了;但是很可惜,这是一个环,我们还无法确定每只蚂蚁的具体位置。
如果有一只蚂蚁逆时针经过 \(0\),那么 \(1\) 号蚂蚁最后的位置就会向前一位,顺时针则会向后一位。于是可以直接计算,时间复杂度 \(\mathcal{O}(n)\)。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e18;
inline int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int a[100005],b[100005],d[100005];
signed main(){
int n=read(),l=read(),t=read(),delta=0;
for(int i=0;i<n;i++){
a[i]=read(),b[i]=3-2*read();
int pos=a[i]+b[i]*t,cnt=pos/l-(pos%l<0);
delta=(delta+cnt%n+n)%n,d[i]=(pos%l+l)%l;
}
sort(d,d+n);for(int i=0;i<n;i++)printf("%lld\n",d[(i+delta)%n]);
return 0;
}