分析:先按区间左端点进行排序,然后遍历区间,找一个区间左右端点覆盖起始点,右端点尽量远,直到可以覆盖目标区间右端点
#include <bits/stdc++.h> using namespace std; const int N = 100010; struct Edge{int a, b;} edges[N]; bool operator <(Edge e1, Edge e2) { return e1.a < e2.a; } int n; int main() { int st, ed; scanf("%d%d",&st,&ed); scanf("%d",&n); for(int i = 0; i < n; i++) { int a, b ; scanf("%d%d",&a,&b); edges[i] = {a,b}; } sort(edges,edges+n); int res = 0; bool f = false; for(int i = 0; i < n; i++) { int j = i, r = -2e9; while(j < n && edges[j].a <= st) { r = max(r,edges[j].b); j++; } if(r < st) { res = -1; break; } res ++; if(r >= ed) { f = true; break; } st = r; i = j - 1; } if(!f) res = - 1; printf("%d ",res); return 0; }