agc013c
题意:n只蚂蚁在周长为L的圆上,延顺时针或逆时针以速度1移动,相遇时两只蚂蚁同时调转方向。求T秒后每只蚂蚁的位置。
相遇后调转方向相当于两只蚂蚁不改变方向,只交换编号,因此可以求出最终蚂蚁的位置集合,又由于相对位置不变,因此只需确定一只蚂蚁的位置。考虑第一只蚂蚁相遇次数即为编号改变次数(顺时针+1,逆时针-1)。因此可以确定一只蚂蚁的位置。
注意最终两只蚂蚁位置相同的情况。
#include <bits/stdc++.h>
using namespace std;
#define N 110000
#define ll long long
ll n,L,T;
ll a[N],b[N],p[N<<1],ans[N];
int main()
{
scanf("%lld%lld%lld",&n,&L,&T);
for(ll i=1;i<=n;i++)
scanf("%lld%lld",&a[i],&b[i]);
for(ll i=1;i<=n;i++)
{
if(b[i]==1)p[i]=(a[i]+T)%L;
else p[i]=((a[i]-T)%L+L)%L;
}
ll tp=p[1];
sort(p+1,p+1+n);
for(ll i=1;i<=n;i++)p[i+n]=p[i];
ll sum=0;
for(ll i=2;i<=n;i++)
if(b[i]!=b[1])
{
ll t;
if(b[1]==1)t=a[i]-a[1];
else t=L-(a[i]-a[1]);
t=T*2-t-1;
if(t<0)continue;
sum+=t/L+1;
}
ll tar,p1;
if(b[1]==2)tar=(1-sum%n+n)%n;
else tar=(1+sum%n)%n;
if(tar==0)tar=n;
if(b[1]==1)
p1=upper_bound(p+1,p+1+n,tp-1)-p;
else
p1=upper_bound(p+1,p+1+n,tp)-p-1;
for(ll i=1;i<=n;i++)
{
ans[tar]=p[p1];
p1++;tar++;
if(tar>n)tar=1;
}
for(ll i=1;i<=n;i++)
printf("%lld\n",ans[i]);
return 0;
}