刚写完时间复杂度为O(n)的答案,突然又想到,如果n的范围超过1e8,那么这时候内存很有可能会爆,又想到能否找出时间复杂度为O(m)的算法,就想到如果某个区间有树,那么这个区间的左右端点一定在我输入的那些终点起点里去找,然后就想到了根据那些已知点的先后循序,结合差分数组,进行跳跃式求值,代码如下
#include <bits/stdc++.h>
using namespace std;
vector<pair<int,int>> arr;
int main() {
int n, m;
cin >> n >> m;
for (int i = 0, x, y; i < m; i++)
{
cin >> x >> y;
arr.push_back({x, 1}), arr.push_back({y+1, -1});
}
int idx = 0, now = 0;
int sum = n+1;
sort(arr.begin(),arr.end());
for (int i = 0; i < arr.size(); i++)
{
sum-=(arr[i].first-idx)*(now>0);
idx=arr[i].first;
now+=arr[i].second;
}
cout<<sum;
}