对给出的区间进行排序 以开始时间为第一关键字,结束为第二关键字,对排序后的区间进行合并操作, 后面就很简单了#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int M = 50005;
struct node {
int star;
int endl;
}oper[M];
int n, m;
int ans;
bool cmp(node p1, node p2) {
if(p1.star != p2.star)
return p1.star < p2.star;
return p1.endl < p2.endl;
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF) {
if(!n && !m)
break;
for(int i = 0; i < m; i++)
scanf("%d%d", &oper[i].star, &oper[i].endl);
sort(oper, oper + m, cmp);
int s = oper[0].star;
int e = oper[0].endl;
int i = 1;
int k = 0;
while(i < m) { //合并操作。
if(s <= oper[i].star && oper[i].endl <= e){
i++;
}else if(s <= oper[i].star && oper[i].endl > e && e >= oper[i].star){
e = oper[i].endl;
i++;
}else {
oper[k].star = s;
oper[k++].endl = e;
s = oper[i].star;
e = oper[i].endl;
i++;
}
}
oper[k].star = s;
oper[k].endl = e;
ans = n+1;
for(i = 0; i <= k; i++) {
ans -= (oper[i].endl - oper[i].star + 1);
//printf("%d %d %d %d\n", i, oper[i].star, oper[i].endl, ans);
}
printf("%d\n", ans);
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int M = 50005;
struct node {
int star;
int endl;
}oper[M];
int n, m;
int ans;
bool cmp(node p1, node p2) {
if(p1.star != p2.star)
return p1.star < p2.star;
return p1.endl < p2.endl;
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF) {
if(!n && !m)
break;
for(int i = 0; i < m; i++)
scanf("%d%d", &oper[i].star, &oper[i].endl);
sort(oper, oper + m, cmp);
int s = oper[0].star;
int e = oper[0].endl;
int i = 1;
int k = 0;
while(i < m) { //合并操作。
if(s <= oper[i].star && oper[i].endl <= e){
i++;
}else if(s <= oper[i].star && oper[i].endl > e && e >= oper[i].star){
e = oper[i].endl;
i++;
}else {
oper[k].star = s;
oper[k++].endl = e;
s = oper[i].star;
e = oper[i].endl;
i++;
}
}
oper[k].star = s;
oper[k].endl = e;
ans = n+1;
for(i = 0; i <= k; i++) {
ans -= (oper[i].endl - oper[i].star + 1);
//printf("%d %d %d %d\n", i, oper[i].star, oper[i].endl, ans);
}
printf("%d\n", ans);
}
return 0;
}