E. Delete a Segment(删除一个区间,让并区间最多)

题:https://codeforces.com/contest/1285/problem/E

题意:给定n个区间,最多删除一个区间,让最后的并区间个数最大

#include<bits/stdc++.h>
using namespace std;
const int M=4e5+5;
pair<int,int>a[M];
int countt[M];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        int tot=0;
        for(int l,r,i=1;i<=n;i++){
            scanf("%d%d",&l,&r);
            a[tot++]=make_pair(l,-i);
            a[tot++]=make_pair(r,i);
            countt[i]=0;
        }
        sort(a,a+tot);
        int ans=0;
        multiset<int>b;
        for(int i=0;i<2*n;i++){
            if(a[i].second<0)///left
                b.insert(-a[i].second);
            else///right
                b.erase(b.find(a[i].second));
            if(b.size()==0)///单独的一个并集 
                ans++;
            if(b.size()==1&&a[i].second>0)///最简单的情况就类似三个区间,中间一个夹住旁边俩个
                if(a[i+1].second<0)///防止"[[]]"的情况 
                    if(a[i].first<a[i+1].first)///排除==的情况,因为这里的==是指的是旁边的俩个,要是等于的话,他们俩个本身就能合成一个集合 
                        countt[*b.begin()]++;
            if(b.size()==1&&a[i].second<0&&a[i+1].second>0)///单单的一个区间 
                countt[*b.begin()]--;
        }
        int sum=-1;
        for(int i=1;i<=n;i++)
            sum=max(sum,countt[i]);
        printf("%d\n",ans+sum);
    }
    return 0;
}
View Code
posted @ 2020-01-17 22:00  starve_to_death  阅读(322)  评论(0编辑  收藏  举报