先分析题干,给出n辆车的信息,要我们求出最少要移除多少辆车后能保证不相撞.

思路:判断车辆是否和他们的位置和速度相关,先按照他们的位置来排序,排序号后按照他们的位置来比较他们的速度.

如果位置靠后的车辆速小则要移除。

这道题的难点在于怎么样求要移除的数量最小,可以沿用最长不下降字串的思路,对于每一个车,如果他的速度不小于它前面的一辆车,那么就将它加入到字串中,如果小于,就找到第一个大于等于他的速度,将两者替换。

替换后分2种情况:

1:替换后新的字串的长度大于原先的字串:子串长度增大,最大字串长度为当前字串的长度。

2:替换后新的字串的长度小于原先的字串:由于替换的是第一个不小于当前车辆的速度,字串长度没变,最长的字串的长度为该字串的长度。

要移除的车辆的数量 = 总车辆 - 最大不下降字串的长度.

#include<bits/stdc++.h>
struct car {
    int v;
    int x;
};
bool comp(const car& a,const car& b){
    return a.x<b.x;
}
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    vector<car> t(n);
    priority_queue<car> s;
    for (int i = 0; i < n; i++) {
        cin >> t[i].x >> t[i].v;
    }
    sort(t.begin(),t.end(),comp);
    vector<int> ans;
    for(auto it=t.begin();it!=t.end();it++){
        if(ans.empty() || ans.back()<= (*it).v){
            ans.push_back((*it).v);
        }else{
            *upper_bound(ans.begin(),ans.end(),(*it).v)=(*it).v;
        }
    }
    cout<<n-ans.size();
}