思路:
1.d==p[i]-t[i]的舞者们在同一个group中,只有这个group才会互相碰撞
证明:假设x(t1)和y(t2)在时间为t时,向碰撞
那么有t-t2=x,t-t1=y . 两式做差消去t 得到 t-t1=y-t2 . 证明完毕
2.对于确定的d . 有几个x就会有x个舞者跑到上边界. 这x个舞者是将所有人按往右跑为优先,Pos越大越好排序所得到的.pos越大,x越小.因此有一个对应关系,用排序可以得到.
#include<bits/stdc++.h>
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
const int N=2e5+6;
const int MOD=1e9+7;
const int INF=0x3f3f3f3f;
int g[N],p[N],t[N];
vector <int> vec[N];
pair <int,int> ans[N];
bool cmp(int u,int v){
if(g[u]!=g[v]) return g[u]==2;
else if(g[u]==g[v]){
if(g[u]==2) return p[u]>p[v];
else if(g[u]==1) return p[u]<p[v];
}
}
int main(void){
int n,w,h;
cin >>n >> w>>h;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&g[i],&p[i],&t[i]);
int te=p[i]-t[i]+1e5;
vec[te].push_back(i);
}
///The talk with the group
for(int d=0;d<=2e5;++d){
vector <int> x,y;
for(auto te : vec[d]){
if(g[te]==1) x.push_back(p[te]);
if(g[te]==2) y.push_back(p[te]);
}
sort(x.begin(),x.end());
sort(y.begin(),y.end());
sort(vec[d].begin(),vec[d].end(),cmp);
// 手动模拟一下可以发现有这样的规律存在
for(int i=0;i<x.size();++i){
ans[vec[d][i]]=make_pair(x[i],h);
}
for(int j=0;j<y.size();j++){
ans[vec[d][j+x.size()]]=make_pair(w,y[y.size()-1-j]);
}
x.clear(),y.clear();
}
for(int i=1;i<=n;i++)
printf("%d %d\n",ans[i].first,ans[i].second);
return 0;
}
/*********
*********/