思路来源:https://blog.csdn.net/qq_28954601/article/details/77800976
首先容易得出的一个结论是 如果 会相遇的话
我们在观察一下 当一个人a改变线路时 和他相撞的另一个人b走了他的线路 假设b后面(向原点远离的方向)没有人 那么b的线路将不再改变 我们可以视为a将它的方向转移给了b 我们维护这个转移的过程就行
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
map<int,deque<int>>mp;
int n,w,h,ansx[N],ansy[N],temp[N];
struct node{
int g,p,t,id;
bool operator < (const node & a)const{
return p<a.p;
}
}q[N];
void cal(int a,int b){
for(int i = 1; i <= n; i++)
if(q[i].g==a) mp[q[i].t-q[i].p].push_back(i);
for(int i = 1; i <= n; i++)
if(q[i].g==b){
auto w = mp.find(q[i].t-q[i].p);
if(w==mp.end()||w->second.empty())
temp[i]=i;
else{
temp[i]=w->second.back();
w->second.pop_back();
w->second.push_front(i);
}
}
mp.clear();
}
void solve(){
sort(q+1,q+1+n);
cal(1,2);cal(2,1);
for(int i = 1; i <= n; i++){
if(q[i].g==1){
ansx[q[temp[i]].id]=q[i].p;
ansy[q[temp[i]].id]=h;
}else{
ansx[q[temp[i]].id]=w;
ansy[q[temp[i]].id]=q[i].p;
}
}
for(int i = 1; i <= n; i++) printf("%d %d\n",ansx[i],ansy[i]);
}
int main(){
scanf("%d%d%d",&n,&w,&h);
for(int i = 1; i <= n; i++) scanf("%d%d%d",&q[i].g,&q[i].p,&q[i].t),q[i].id=i;
solve();
return 0;
}