大致题意:
有一个W*H的长方形,有n个人,分别站在X轴或Y轴,并沿直线向对面走,第i个人在ti的时刻出发,如果第i个人与第j个人相撞了
那么则交换两个人的运动方向,直到走到长方形边界停止,问最后每个人的坐标。
题解:
两个人要相撞,当且仅当Xi-Ti=Xj-Tj,所以可以将Xi-Ti分组,对于同一组里的人会互相碰撞,不同组的不会,这样就只要考虑同一组里
的人,画个图可以发现,规律
然后根据规律化坐标即可
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<vector> 7 #include<queue> 8 #include<set> 9 #include<map> 10 using namespace std; 11 #define eps 1e-6 12 #define For(i,a,b) for(int i=a;i<=b;i++) 13 #define Fore(i,a,b) for(int i=a;i>=b;i--) 14 #define lson l,mid,rt<<1 15 #define rson mid+1,r,rt<<1|1 16 #define mkp make_pair 17 #define pb push_back 18 #define sz size() 19 #define met(a,b) memset(a,b,sizeof(a)) 20 #define iossy ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) 21 #define fr freopen 22 #define pi acos(-1.0) 23 #define Vector Point 24 typedef pair<int,int> pii; 25 const long long linf=1LL<<62; 26 const int iinf=1<<30; 27 const double dinf=1e17; 28 const int Mod=1e9+9; 29 typedef long long ll; 30 typedef long double ld; 31 const int maxn=1000005; 32 struct node{ 33 int x,t,g; 34 int id; 35 }; 36 bool cmp(node a,node b){ 37 if(a.g==b.g){ 38 if(a.g==1) return a.x<b.x; 39 if(a.g==2) return a.x>b.x; 40 } 41 return a.g<b.g; 42 } 43 bool cmp2(node a,node b){ 44 if(a.g==b.g) { 45 if(a.g==1) return a.x<b.x; 46 return a.x>b.x; 47 } 48 return a.g>b.g; 49 } 50 const int maxt=100005; 51 vector<node>vc[maxn]; 52 vector<pair<int,int> >vcc; 53 pii p,ans[maxn]; 54 node nd; 55 int n,w,h; 56 void solve(){ 57 iossy; 58 cin>>n>>w>>h; 59 For(i,1,n){ 60 cin>>nd.g>>nd.x>>nd.t;nd.id=i; 61 vc[maxt+nd.x-nd.t].pb(nd); 62 } 63 For(i,0,maxt+maxt){ 64 vcc.clear(); 65 if(!vc[i].sz)continue; 66 sort(vc[i].begin(),vc[i].end(),cmp); 67 For(j,1,vc[i].sz){ 68 if(vc[i][j-1].g==1) vcc.pb(mkp(vc[i][j-1].x,h)); 69 else vcc.pb(mkp(w,vc[i][j-1].x)); 70 } 71 sort(vc[i].begin(),vc[i].end(),cmp2); 72 For(j,1,vc[i].sz){ 73 ans[vc[i][j-1].id]=vcc[j-1]; 74 } 75 } 76 For(i,1,n) 77 cout<<ans[i].first<<" "<<ans[i].second<<endl; 78 } 79 int main(){ 80 int t=1; 81 while(t--) solve(); 82 return 0; 83 }