[AT2369] [agc013_c] Ants on a Circle

本文解析了AtCoder竞赛中的一道题目,通过分析蚂蚁在直线上的移动和相遇情况,提出了一种高效的解决方案。文章详细介绍了如何利用相对位置不变性和编号交换的概念来解决蚂蚁移动问题,并提供了完整的代码实现。

题目链接

AtCoder:https://agc013.contest.atcoder.jp/tasks/agc013_c

洛谷:https://www.luogu.org/problemnew/show/AT2369

Solution

首先可以注意到他们的相对位置是不变的。

然后两只蚂蚁相遇可以看作是他们穿过了彼此然后交换编号。

那么我们就可以得到最后的位置了,只需要确定编号就好了。

注意到如果有一只蚂蚁穿过了\(l-1\sim 0\)之间,所有编号都会左移(右移)一格。

那么我们只需要处理出他们编号是怎么移的就好了。

#include<bits/stdc++.h>
using namespace std;

#define int long long 

void read(int &x) {
    x=0;int f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}

void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}

#define lf double
#define ll long long 

const int maxn = 1e5+10;
const int inf = 1e9;
const lf eps = 1e-8;

int p[maxn],n,c,l,t;

signed main() {
    read(n),read(l),read(t);
    for(int i=1,x;i<=n;i++) {
        read(p[i]),read(x);x=x==2?-1:x;p[i]+=x*t;
        if(p[i]>0) c+=p[i]/l;
        else if(p[i]<0) c+=(p[i]+1)/l-1;p[i]=(p[i]%l+l)%l;
    }sort(p+1,p+n+1);
    c=(c%n+n)%n;
    for(int i=c+1;i<=n;i++) write(p[i]);
    for(int i=1;i<=c;i++) write(p[i]);
    return 0;
}

转载于:https://www.cnblogs.com/hbyer/p/10717599.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值