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

Posted starve_to_death

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于E. Delete a Segment(删除一个区间,让并区间最多)的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 1285E. Delete a Segment

E. Segment Sum(数位dp)

E. XOR on Segment(区间异或)

Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum

Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum

oracle中的表空间(tablespace)方案(schema)段(segment)区(extent)块(block)