当前位置: 代码迷 >> 综合 >> Codeforces Round #506 (Div. 3) C Maximal Intersection (cf 1029C)
  详细解决方案

Codeforces Round #506 (Div. 3) C Maximal Intersection (cf 1029C)

热度:53   发布时间:2023-12-06 08:07:48.0

题目:Maximal Intersection

题意:给出数轴上的一些线段,可以任意删掉其中的一条线段,求最大的删除后所有线段的重合处的长度。

思路:
可以预先算出不删除时最靠右的左端点和最靠左的右端点,以及第二靠右的左端点和第二靠左的右端点。
然后判断能否用 第二靠右的左端点和第二靠左的右端点 来更新 最靠右的左端点和最靠左的右端点。
注意当 第二靠右的左端点和第二靠左的右端点 在同一条线段上时要特判一下。
比赛是我就忘记考虑这种情况,被hack掉了QωQ,hack数据:

Input
2
1 10
2 5Output
9

代码:

#include<bits/stdc++.h>
using namespace std;#define ll long long
#define inf (1<<30)
#define maxn 300000struct Pair{int x,y;Pair(){}pair(int xx,int yy){x=xx,y=yy;}
};int n;
Pair a[maxn+5];void read(int& x) {scanf("%d",&x);
}int main() {read(n);for(int i=1;i<=n;i++) read(a[i].x),read(a[i].y);int maxx=-1,miny=inf;int maxxx=-1,minyy=inf;int s1=0,s2=0;int xx,yy;for(int i=1;i<=n;i++) {if(a[i].x>maxx) {maxx=a[i].x;s1=1;xx=i;} else if(a[i].x==maxx) {s1++;}if(a[i].y<miny) {miny=a[i].y;s2=1;yy=i;} else if(a[i].y==miny) {s2++;}}for(int i=1;i<=n;i++) {if(a[i].x>maxxx&&a[i].x!=maxx) maxxx=a[i].x;if(a[i].y<minyy&&a[i].y!=miny) minyy=a[i].y;}int ans=miny-maxx;if(s1==1&&maxxx!=-1) ans=max(ans,miny-maxxx);if(s2==1&&minyy!=inf) ans=max(ans,minyy-maxx);if(s1==1&&s2==1&&xx==yy) ans=max(ans,minyy-maxxx);if(ans<0) ans=0;printf("%d",ans);return 0;
}
  相关解决方案