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);

}
View Code

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;
}
View Code

 

posted @ 2018-08-26 20:02  shuai_hui  阅读(458)  评论(0编辑  收藏  举报