0
点赞
收藏
分享

微信扫一扫

51nod 1091 线段的重叠

最不爱吃鱼 2022-07-15 阅读 66


题目链接:​​传送门​​​
是不重叠线段简单版,这个只用对开始的端点进行大小排序,每次记录最后面的端点的位置r
如果当前的线段的右端点小于r,则这个线段被另一个大的线段包住,否则则要算到这个线段的左端点到这个r,计算长度并且更新r就行了
代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 50010
struct rng{
int s,e;
}t[N];
bool cmp(rng a,rng b){
if(a.s<b.s) return 1;
if(a.s==b.s&&a.e<=b.e) return 1;
return 0;
}
int main(){
int i,j,n,m,k;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++)
cin>>t[i].s>>t[i].e;
sort(t+1,t+1+n,cmp);
int r=t[1].e;
int res=0;
// for(i=1;i<=n;i++) cout<<t[i].s<<t[i].e<<endl;
for(i=2;i<=n;i++){
if(t[i].s>=r){
r=t[i].e;
continue;
}
if(t[i].e>=r){
int x=r-t[i].s;
if(x>res)
res=x;
r=t[i].e;
continue;
}
if(t[i].e<=r){
int x=t[i].e-t[i].s;
if(x>res)
res=x;
continue;
}
}
cout<<res<<endl;
}
return 0;
}


举报

相关推荐

0 条评论