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\n",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\n",ans[i]); 42 return 0; 43 }