题目描述
题目链接:
https://www.acwing.com/problem/content/424/
思路分析
-
先理清题意:
-
第一种思维:开辟bool数组
-
第二种思维:区间合并算法
代码实现
第一种方法:基础做法
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10010;
int L,n;
bool st[N];
int main()
{
cin>>L>>n;
for(int i=0;i<=L;i++) st[i]=true;
while(n--)
{
int a,b;
cin>>a>>b;
for(int i=a;i<=b;i++) st[i]=false;
}
int res=0;
for(int i=0;i<=L;i++) res+=st[i];
cout<<res<<endl;
return 0;
}
第二种方法:区间合并
C++两种写法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int m, n;
struct Segment
{
int l, r;
bool operator< (const Segment& t) const
{
return l < t.l;
}
}seg[N];
int main()
{
cin >> m >> n;
for (int i = 0; i < n; i ++ ) cin >> seg[i].l >> seg[i].r;
sort(seg, seg + n);
int sum = 0;
int L = seg[0].l, R = seg[0].r;
for (int i = 1; i < n; i ++ )
if (seg[i].l <= R) R = max(R, seg[i].r);
else
{
sum += R - L + 1;
L = seg[i].l, R = seg[i].r;
}
sum += R - L + 1;
cout << m + 1 - sum << endl;
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N = 110;
int n,m;
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 start=0,end=-1;
for(int i=0;i<m;i++)
if(end<q[i].x)
{
sum+=end-start+1;
start=q[i].x,end=q[i].y;
}
else
{
end=max(end,q[i].y);
}
sum+=end-start+1;
cout<<n+1-sum<<endl;
return 0;
}