题意: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;
}

标签: 模拟

添加新评论