题目:
见https://www.luogu.com.cn/problem/P1496
思路:
没啥思路就是一个简简单单的模拟题,可是我不会…对各个区间的起点和终点按从小到大进行排序,优先比较起点再比较终点,然后就会出现三种情况:
1.相邻两个区间相交
2.相邻两个区间有一个被包涵
3.相邻两个区间断开
代码:
#include<iostream>
#include<algorithm>
#include<climits>
using namespace std;
typedef pair<int,int> PII;
const int N=2e4+10;
PII points[N];
bool cmp(PII A,PII B)
{
if(A.first==B.first)
return A.second<B.second;
return A.first<B.first;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
points[i]={a,b};
}
sort(points+1,points+n+1,cmp);
int Start=points[1].first;
int End=points[1].second;
points[n+1].first=INT_MAX;
points[n+1].second=INT_MAX;
int res=0;
for(int i=2;i<=n+1;i++)
{
int a=points[i].first;
int b=points[i].second;
if(a<End&&b>End)//判断条件仔细考虑啊!!!
End=b;
else if(a>=End)//判断条件仔细考虑啊!!!
{
res+=End-Start;
Start=a;
End=b;
}
}
cout<<res<<endl;
return 0;
}