方法一(传统暴力)
#include <iostream>
using namespace std;
const int N = 100010;
int n, m;
bool tree[N];
int main()
{
cin >> n >> m;
for(int i = 0; i < m; i ++)
{
int l, r;
cin >> l >> r;
for(int j = l; j <= r; j ++)
{
tree[j] = true;
}
}
int res = 0;
for(int i = 0; i <= n; i ++)
{
if(tree[i] == false) res ++;
}
cout << res << endl;
return 0;
}
如果n为字长,m为区间个数。
这个方法不好的点在于,时间复杂度太高O(n*m)。
方法二:
区间合并复杂度mlogm
#include <iostream>
#include <algorithm>
//using namespace std一定要写在pair前面,因为原来是std::pair
using namespace std;
#define x first
#define y second
typedef pair<int, int> PII;
int n, m;
const int N = 110;
PII q[N];
int main()
{
cin >> n >> m;
for(int i = 0; i < m; i ++) cin >> q[i].x >> q[i].y;
sort(q, q + m);
int sum = 0;
int st = 0, ed = -1;
for(int i = 0; i < m; i ++)
{
if(ed < q[i].x)
{
sum += ed - st + 1;
st = q[i].x, ed = q[i].y;
}
else ed = max(ed, q[i].y);
}
sum += ed - st + 1;
cout << n + 1 - sum << endl;
return 0;
}