• 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
    ",ans+sum);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    hdu5514 非2的次幂容斥原理
    「NOIP2015」斗地主
    「NOIP2009」靶形数独
    「CF521D」Shop
    「HNOI2015」菜肴制作
    「NOIP2011」观光公交
    「NOI2015」荷马史诗
    「JSOI2007」建筑抢修
    「CF161B」Discounts
    叠罗汉
  • 原文地址:https://www.cnblogs.com/starve/p/12207637.html
Copyright © 2020-2023  润新知