【CF848B】応援の歌

トピックリンク

\(解決\)

その質問アリの練習と同様に

弾性衝突位置の切り替えに相当し、開始点を考慮して、前進し続ける((X、0)\)\、時間\(T \)出発(ダンサー\)\に相当する、\((X、-t)\ )座標の出発は、最終的には全て終了位置が一定であるが、私は何を知らない\(ダンサー\)のペア

二つの\(ダンサー\)条件が衝突である\(X + Y \) 等しいです

全て等しい見つけることは困難で\((x、y)を\ ) の傾きで(\ 1) - \衝突のセット、ある直線上の\(ダンサー\)、1 \(ダンサー\ )他になければなりません\(ダンサー\)左上または右下に

衝突に起因して、すべての\(ダンサー\)の相対位置は変化せず、最終的な位置は、初期位置とペアにすることができます

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

const int MAXN=100010;

inline int read(){
    int x=0; char c=getchar();
    while(c<'0') c=getchar();
    while(c>='0') x=x*10+c-'0',c=getchar();
    return x;
}

int n,w,h;

struct NODE{
    int x,y,ex,ey,id;
}a[MAXN],b[MAXN];

inline bool cmp1(NODE u,NODE v){
    return u.x+u.y>v.x+v.y||(u.x+u.y==v.x+v.y&&u.x-u.y>v.x-v.y);
}

inline bool cmp2(NODE u,NODE v){
    return u.x+u.y>v.x+v.y||(u.x+u.y==v.x+v.y&&u.ex-u.ey>v.ex-v.ey);
}

int Ansx[MAXN],Ansy[MAXN];

int main()
{
    n=read(); w=read(); h=read();
    int g,p,t;
    for(int i=1;i<=n;++i){
        g=read(); p=read(); t=read();
        if(g==1) a[i]=(NODE){p,-t,p,h,i};
        else a[i]=(NODE){-t,p,w,p,i};
        b[i]=a[i];
    }
    sort(a+1,a+1+n,cmp1);
    sort(b+1,b+1+n,cmp2);
    for(int i=1;i<=n;++i)
        Ansx[a[i].id]=b[i].ex,Ansy[a[i].id]=b[i].ey;
    for(int i=1;i<=n;++i)
        printf("%d %d\n",Ansx[i],Ansy[i]);
    return 0;
}

おすすめ

転載: www.cnblogs.com/yjkhhh/p/11813371.html