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; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值