CF C. Maximal Intersection(贪心 || STL)
题意
给你N个线段(一条直线上),问删去一个之后,最长公共长度 ;
分析:首先我们得先知道n条线段公共的线段一定是(LMAX,RMIN) ,那我们可以先排序,然后枚举删除边;
#include<stdio.h>
#include<algorithm>
using namespace std;
struct no
{
int l,r;
}a[300001];
int l[300001],r[300001];
int main( )
{
int n;
scanf("%d",&n);
for(int i=1 ; i<=n ; i++)
{
scanf("%d%d",&a[i].l,&a[i].r);
l[i]=a[i].l;r[i]=a[i].r;
}
sort(l+1,l+1+n);
sort(r+1,r+1+n);
int ans = 0;
for(int i=1 ; i<=n ; i++)
{
int end=l[n];///左端点最大部分;
int st=r[1];///右端点最小的部分
if(end==a[i].l)/// 如果删边为最后一个左端点,左移一位
end=l[n-1];
if(st==a[i].r)/// 如果删边为最后一个左端点,左移一位
st=r[2];
ans = max(ans,st-end);
}
printf("%d\n",ans);
}
SLT 做法;
c.begin() 返回一个迭代器,它指向容器c的第一个元素
c.end() 返回一个迭代器,它指向容器c的最后一个元素的下一个位置
c.rbegin() 返回一个逆序迭代器,它指向容器c的最后一个元素
c.rend() 返回一个逆序迭代器,它指向容器c的第一个元素前面的位置
multiset和set不同之处在于multiset可以有重复的元素。
#include<bits/stdc++.h>
#define maxn 300005
using namespace std;
multiset<int>a,b;
int L[maxn],R[maxn];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>L[i]>>R[i];
a.insert(L[i]);
b.insert(R[i]);
}
/// cout<<-1<<endl;
int ans=0;
for(int i=0;i<n;i++)
{
a.erase(a.find(L[i]));
b.erase(b.find(R[i]));
ans=max(ans,*(b.begin())-*(a.rbegin()));
a.insert(L[i]);
b.insert(R[i]);
}
cout<<ans<<endl;
return 0;
}