大致题意:

      有一个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 }
View Code