根据题意简化成每段区间成功添加到集合后 最大的区间长度
但如果按个遍历集合内每个元素 时间复杂度为$O_n$超时 借助set二分查找优化为$log(n)$后即可
#include <iostream>
#include<algorithm>
#include <set>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
set<PII> p;
int main() {
int q;
scanf("%d",&q);
int tem=0;
for(int i=1;i<=q;i++){
int l,r;
scanf("%d%d",&l,&r);
auto t=p.lower_bound({l,0});//返回第一个大于等于{l,0}的
bool st=true;
if(t!=p.end()&&t->first<=r)st=false;//先看右边 如果为end肯定不会重叠 否则判断是否重叠
if(st&&t!=p.begin()){ //在满足右边情况下 如果为第一个则不会重叠 否则进行判断
auto h=prev(t); //迭代器prev找前一个
if(h->second>=l)st=false;
}
if(st){
p.insert({l,r});//不重叠则插入
tem=max(tem,r-l+2);//注意0肯定存在
}printf("%d\n",tem);
}
return 0;
}

京公网安备 11010502036488号