1. 程式人生 > >Codeforces Round #478 (Div. 2) D Ghosts 會超時的判斷兩個之間關係,可以用map

Codeforces Round #478 (Div. 2) D Ghosts 會超時的判斷兩個之間關係,可以用map

給出起始座標(x,y)要充分利用題目條件,最好全都列出來

運動方向(Vx,Vy)

很容易得到判斷兩個是否相碰

(gho[a].y-gho[b].y)*1.0/(gho[a].vy-gho[b].vy)==(gho[a].x-gho[b].x)*1.0/(gho[a].vx-gho[b].vx)

但是每一個都判斷雙重迴圈肯定超時

不要忘了題目為什麼給定初始位置在一條直線上,而不是任意位置,肯定是為了化簡上面式子!

所以最後化得 vyiavxi=vyjav

所以用map 儲存,看有沒有符合的

同時要減去平行的那些

轉自https://www.cnblogs.com/ZhenghangHu/p/8982277.html

include<iostream>
#include<map>
#define ll long long
#define MAXN 200000
using namespace std;

ll n,a,b,ans,parallel;
map<long long,int> m;
map< pair<int,int>,int> p;
int main(){
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++){
        int x,Vx,Vy; scanf("%d%d%d",&x,&Vx,&Vy);
        //每個維護出來a*Vx-Vy
        ll key = a*Vx-Vy;
        ans+=m[key];//相同key的能collide 
        m[a*Vx-Vy]++;
        parallel+=p[ make_pair(Vx,Vy) ];//同是1,2 就是平行,一個1,2 一個2,4 雖然方向平行,但是可能反方向的,會可能相碰,他們vy-a*vx不相等所以不用考慮
        p[  make_pair(Vx,Vy)  ]++;
    }
    cout<<(ans-parallel)*2;
    
    return 0; 
}