AT2369 Ants on a Circle (思路)

考虑到蚂蚁们的相对位置不会变化,而且,如果把“相遇后掉头”看作是“相遇后交换编号”的话,也可以得出来最后都有哪些位置有蚂蚁

然后,只要确定哪个位置是“1”就可以了

然后搞一个指针p代表原来第一个位置的蚂蚁现在的位置(相对于0来说的),每当有蚂蚁穿过0位置,p就根据穿过的方向加加减减就可以了

 1 #include<bits/stdc++.h>
 2 #include<tr1/unordered_map>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 #define MP make_pair
 5 #define fi first
 6 #define se second
 7 using namespace std;
 8 typedef long long ll;
 9 typedef unsigned long long ull;
10 typedef long double ld;
11 typedef pair<int,int> pa;
12 const int maxn=1e5+10;
13 
14 inline ll rd(){
15     ll x=0;char c=getchar();int neg=1;
16     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
17     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
18     return x*neg;
19 }
20 
21 int L,N,x[maxn],dir[maxn],y[maxn],rnk[maxn],T,ans[maxn];
22 
23 inline bool cmp(int a,int b){return x[a]<x[b];}
24 
25 int main(){
26     //freopen("","r",stdin);
27     N=rd(),L=rd(),T=rd();
28     for(int i=1;i<=N;i++) x[i]=rd(),dir[i]=(rd()==1?1:-1),rnk[i]=i;
29     sort(rnk+1,rnk+N+1,cmp);
30     ll p=0;
31     for(int i=1;i<=N;i++){
32         y[i]=((x[i]+T*dir[i])%L+L)%L;
33         if(dir[i]==1) p+=ceil(1.0*(T-(L-x[i])+1)/L);
34         else p-=ceil(1.0*(T-x[i])/L);
35         // printf(":%d
",p);
36     }
37     p=(p%N+N)%N;
38     sort(y+1,y+N+1);
39     for(int i=p+1;i<=N;i++) ans[rnk[i-p]]=y[i];
40     for(int i=1;i<=p;i++) ans[rnk[N+i-p]]=y[i];
41     for(int i=1;i<=N;i++) printf("%d
",ans[i]);
42     return 0;
43 }
原文地址:https://www.cnblogs.com/Ressed/p/10585277.html