Codeforces Round #478 (Div. 2) D Ghosts 會超時的判斷兩個之間關係,可以用map
阿新 • • 發佈:2018-12-24
給出起始座標(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)
但是每一個都判斷雙重迴圈肯定超時
不要忘了題目為什麼給定初始位置在一條直線上,而不是任意位置,肯定是為了化簡上面式子!
所以最後化得 vyi−a∗vxi=vyj−a∗v
所以用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; }