【思维题】AGC013C - Ants on a Circle
妙妙技巧题
题目描述
题目大意
一个圆环上有n只蚂蚁,它们会按照顺时针或者逆时针行走。如果有蚂蚁相遇它们就会掉头(不一定在整数时间掉转)。问最后每只蚂蚁的位置。
题目分析
以前在luogu上做过一道类似的掉头问题,于是考试时候就很大意地把它压在最后做了……
我们考虑一下,这n只蚂蚁的相对位置其实是不会改变的,并且我们可以算出最终所有蚂蚁的位置。
那应该如何计算第一只蚂蚁最后的顺序呢?
想象在n-1到0之间有一只哨兵蚂蚁,它是不会移动的。当有蚂蚁从左边或右边穿过它的时候,我们的一号蚂蚁相当于次序+1或-1了。
再就是细节问题:$(a[i]\%l)<0$时,意味着这只蚂蚁从右边向左边运动后,还少了一次+l,所以注意在这个地方特别处理一下就好了。
1 #include<bits/stdc++.h> 2 const int maxn = 100035; 3 4 int a[maxn],n,l,t,x,cnt; 5 6 int main() 7 { 8 scanf("%d%d%d",&n,&l,&t); 9 for (int i=1; i<=n; i++) 10 { 11 scanf("%d%d",&a[i],&x); 12 a[i] += x==1?t:-t; 13 cnt += a[i]/l; 14 if (a[i]%l<0) cnt--; //就是这里细节的处理 15 ((a[i]%=l)+=l)%=l; 16 } 17 std::sort(a+1, a+n+1); 18 ((cnt%=n)+=n)%=n; 19 // for (int i=1; i<=n; i++) printf("%d\n",a[i]); 20 for (int i=cnt+1; i<=n; i++) printf("%d\n",a[i]); 21 for (int i=1; i<=cnt; i++) printf("%d\n",a[i]); 22 return 0; 23 }
END