因为每个球最终的相对位置的序号是不变的
而且碰撞可以看成穿过,所以直接可以计算所有的最终位置
和树上的蚂蚁这题很像
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char** argv) {
int n,L,t;
cin>>n>>L>>t;
vector<pair<int, int> > b(n); //用来定位第i个小球的位置
vector<int> a(n); // 结果位置的数组
vector<int> ans(n); // 用来记录第i个小球的相对位置是哪个
int sum = 0;
for(int i=0; i<n; i++){ //输入数据
cin>>a[i];
b[i]=make_pair(a[i],i);
sum = (a[i]+t)/(L); // 求走了整个尺子几次
int rem = (a[i]+t)%(L); // 没有完整的走下来的剩余的步数
if(sum&1) // 如果走过整个尺子是奇数次,那么相当于剩下的是在从L往回走
a[i]=L-rem;
else // 反之,就是在从0往L这个方向走
a[i]=rem;
}
sort(b.begin(), b.end()); // 这样是为了按照起步位置排序,然后确定第i个点出发的相对是第几号
sort(a.begin(), a.end()); // 最左起步的点还是最左的位置,所以最终位置要排序
for(int i=0; i<n; i++){ // ans[i] 表示的是第i个人是第几个起步的
ans[b[i].second] = i;
}
for(int i=0; i<n; i++){ // a[i]存着第i个起步的人的最终位置, 所以a[ans[i]] 就是第i个人的最终位置
cout<<a[ans[i]]<<" ";
}
return 0;
}