考虑对车双关键字排序,第一关键字为坐标,第二关键字为速度。
排序后,只有前后不同类型车辆可以碰撞,在相同坐标的车已经按照速度排序的情况下,让每辆车指向前一辆和后一辆型号不同的车,一定能覆盖所有会碰撞的车。所以正负分别跑一遍取最小值就可以了(注意特判碰撞时间是否为整数,如果为整数则-1)。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6+10;
int nex[N],pre[N];
struct node{
int p,v,t;
}a[N];
int n,k,last;
bool cmp(node a,node b){
if(a.p==b.p)return a.v < b.v;
return a.p < b.p;
}
signed main(){
cin >> n >> k;
for(int i = 0 ; i < n ; i ++ )cin >> a[i].p >&g