这题肯定不能暴力(因为这道题目的数据很大,暴力的话毫无疑问是tle的)。
那么就需要写进结构体进行排序。
有个大坑:
绝对不能用a[i]和a[i-1]比,因为会遗忘之前的右端点而造成内部的区间进行比较错误地更新sum值!必须和temp右端点比较!!!
#include <iostream>
#include<algorithm>
using namespace std;
int n, m;
struct node {
int l, r;
}a[1000005];
bool cmp(node a, node b) {
if (a.l != b.l)return a.l < b.l;
else return a.r < b.r;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> a[i].l >> a[i].r;
}
sort(a + 1, a + 1 + m, cmp);
int sum = a[1].r - a[1].l + 1;
/* for (int i = 2; i <= m; i++) {
if (a[i].l <= a[i - 1].r && a[i].r > a[i - 1].r) {
sum += a[i].r - a[i - 1].r;
}
else if(a[i].l > a[i - 1].r)sum += (a[i].r - a[i].l + 1);
}*/
//这是掉坑里的代码,必WA!!
int temp = a[1].r;//必须要记录下来!!
for (int i = 2; i <= m; i++) {
if (a[i].l <= temp && a[i].r > temp) {
sum += a[i].r - temp;
temp = a[i].r;
}
else if (a[i].l > temp) {
sum += (a[i].r - a[i].l + 1);
temp = a[i].r;
}
}
cout << n + 1 - sum << endl;
}