AGC013C. Ants on a Circle

原:CF652F. 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;
}
posted @ 2023-09-01 21:22  xx019  阅读(19)  评论(1编辑  收藏  举报