菜鸟生成记(64)
一道区间模拟题,唯一的坑点,不特判的话区间会重复累加
思路:将n个区间的左右界点存入结构体数组中排序,第一优先排序 左界点,第优先排序 右界点
bool operator<(const st &p)const
{
if(a!=p.a)
return a<p.a;
else
return b<p.b;
return false;
}
bool cmp(st &x,st &y)
{
if(x.a!=y.a)
return x.a<y.a;
else
return x.b<y.b;
return false;
}
然后用两个变量记录上一个区间的左右界点,然后当前区间的左右界点与这两个记录变量比较;
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e4+10;
struct st{
int a,b;
bool operator<(const st &p)const
{
if(a!=p.a)
return a<p.a;
else
return b<p.b;
return false;
}
}s[N];
int main()
{
int n;
long long sum=0;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d%d",&s[i].a,&s[i].b);
}
sort(s,s+n);
int a,b;
a=s[0].a;
b=s[0].b;
sum+=b-a;
for(int i=1;i<n;++i)
{
if(s[i].a>=b)
{
sum+=s[i].b-s[i].a;
a=s[i].a;
if(s[i].b>b)
b=s[i].b;
}
else if(s[i].a<b)
{
if(s[i].b>=b)
{
sum+=s[i].b-b;
a=s[i].a;
if(s[i].b>b)
b=s[i].b;
}
else if(s[i].b<b)
{
a=s[i].a;
if(s[i].b>b)
b=s[i].b;
}
}
}
printf("%lld",sum);
return 0;
}