E. Delete a Segment(删除一个区间,让并区间最多)
题:https://codeforces.com/contest/1285/problem/E
题意:给定n个区间,最多删除一个区间,让最后的并区间个数最大
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }