思路即先排序贪心去重后再遍历计算最少个数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,t;
vector<pair<int,int> > a;
pair<int,int> ta[25010];
int tot;
int f[25010],las[25010],minn = 0x3ffffff,maxn = -1;
bool cmp(pair<int,int> x,pair<int,int> y) {
return x.first == y.first ? x.second < y.second : x.first < y.first;
}
int main() {
cin >> n >> t;
for(int i = 1;i <= n;i++) {
int t,tt;
cin >> t >> tt;
a.push_back(make_pair(t,tt));
}
sort(a.begin(),a.end(),cmp);
for(int i = 0;i < n;i++) {
if(a[i].first == a[i+1].first) continue;
if(i > 0 && a[i].second <= a[i-1].second) continue;
ta[++tot] = make_pair(a[i].first,a[i].second);
maxn = max(maxn,ta[tot].second);
}
for(int i = 1;i <= tot;i++) {
cout << ta[i].first << " " << ta[i].second << endl;
}
if(ta[1].first > 1 || maxn < t) {
cout << -1;
return 0;
}
f[1] = 1,las[1] = ta[1].second;
if(ta[1].second == t) {
cout << 1;
return 0;
}
maxn = ta[1].second;
for(int i = 2;i <= tot;i++) {
if(maxn < ta[i].first-1) {
cout << -1;
return 0;
}
maxn = max(maxn,ta[i].second);
int key = lower_bound(las+1,las+i-1,ta[i].first-1)-las;
f[i] = f[key] + 1;
las[i] = ta[i].second;
if(ta[i].second == t) minn = min(minn,f[i]);
}
cout << minn;
return 0;
}