题目: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;
}