思路:
1.d==p[i]-t[i]的舞者们在同一个group中,只有这个group才会互相碰撞
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){ // cout <<"BUG"<<endl; 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; } /********* *********/