/*区间 [a, b] */ structrange { int a, b; range(int _a, int _b) :a(_a), b(_b) {} booloperator < (const range r)const { if (a == r.a) return b > r.b; return a < r.a; } };
intrangeCover(vector<range> v, int t){ //按a升序 按b降序 sort(v.begin(), v.end());
if (v.at(0).a > 1)//起始不是 1,一定不能办到 return-1; //标记当前选取区间的起点,终点 intbegin = 1, end = v.at(0).b, pos = 0, count = 1;
while (end != t) { int temp = 0; begin = end + 1;//下一个标记的起始点为本次标记终点+1 for (int i = pos; i < v.size(); i++) { if (v.at(i).a > begin) {//遇到了第一个起始点 > 标记起始点的 pos = i; break; } elseif (v.at(i).a <= begin && v.at(i).b >= end) {//可选区间 temp = i;//记录当前标号 end = v.at(i).b;//更新标记末端 } } if (begin > end) {//标记了下一个区间的起始点 但没有找到此区间 return-1; break; } else {//这个标记的区间可行 pos = temp + 1;//从那个标记的标号开始 进行下一次循环 count++;//计数+1 } }
return count; }
intmain(){ int n, t; scanf_s("%d%d", &n, &t); vector<range> v; for (int i = 0; i < n; i++) { int a, b; scanf_s("%d%d", &a, &b); if ((a >= 1 && a <= t) || (b >= 1 && b <= t)) {//先对输入进行裁剪 if (a < 1)//合法区间 但 a < 1,可令 a = 1 a = 1; range r(a, b); v.push_back(r); } }