码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-01-17 23:23:40      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:first   color   ble   eve   ras   个数   second   code   hid   

题: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

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

标签:first   color   ble   eve   ras   个数   second   code   hid   

原文地址:https://www.cnblogs.com/starve/p/12207637.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!