题目:有许多蚂蚁在一根无限长的木棍上,每一只蚂蚁都有一个初始位置和初始朝向(任意两只蚂蚁的初始位置不同)。蚂蚁们以每秒一个单位的速度向前移动,当两只蚂蚁相遇时,它们会掉头(掉头时间忽略不计)。现给出每只蚂蚁的初始位置和初始朝向,请你计算出它们在 tt 秒后的位置和朝向。
题解:1.忽略蚂蚁的编号,所有蚂蚁的最终的位置可视为蚂蚁相遇直接穿过不返回的最终位置
2.考虑蚂蚁的编号,所有的蚂蚁在运动过程中的相对位置始终保持不变
3.根据1和2我们可以知道蚂蚁的最终朝向,和最终位置即为假定蚂蚁直接穿过到达这个位置的那个蚂蚁的朝向和最终位置
AC代码实现如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
struct node{
int pos,to,id,index,final_pos,final_to;//id是题目中蚂蚁的输入顺序,index是在坐标轴上从左到右的顺序
}a[maxn];
struct node1{
int pos,to;
}b[maxn];
bool cmp1(node a,node b){
return a.pos<b.pos;//pos1代表初始位置
}
bool cmp2(node1 a,node1 b){
return a.pos<b.pos;//pos2代表最终位置(当然这个位置可能不是这个蚂蚁的)
}
bool cmp3(node a,node b){
return a.id<b.id;
}
int main(){
int n,t;
cin>>n>>t;
map<int,int>num;
for(int i=1;i<=n;i++){
cin>>a[i].pos>>a[i].to;
a[i].id=i;
b[i].to=a[i].to;
if(a[i].to==1)b[i].pos=a[i].pos+t;
else b[i].pos=a[i].pos-t;
num[b[i].pos]++;
}
sort(a+1,a+1+n,cmp1);
for(int i=1;i<=n;i++)a[i].index=i;
sort(b+1,b+1+n,cmp2);
for(int i=1;i<=n;i++){
a[i].final_pos=b[i].pos;
a[i].final_to=b[i].to;
}
sort(a+1,a+1+n,cmp3);
for(int i=1;i<=n;i++){
if(num[a[i].final_pos]>1)a[i].final_to=0;
cout<<a[i].final_pos<<" "<<a[i].final_to<<endl;
}
}