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; }
以上是关于E. Delete a Segment(删除一个区间,让并区间最多)的主要内容,如果未能解决你的问题,请参考以下文章
codeforces 1285E. Delete a 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)