珂朵莉树模板题,根据输入维护区间,perform需要做的是统计连续没有被占用的区间长度
struct ODT {
std::map<i32,i32> mp;
ODT(i32 l, i32 r,i32 v=-1) {
mp[l]=v;
mp[r+1]=v;
}
auto split(i32 pos) {
auto it=std::prev(mp.upper_bound(pos));
return mp.insert(it,std::make_pair(pos,it->second));
}
void assign(i32 l,i32 r,i32 v) {
auto it=split(l);
split(r);
while (it->first!=r) {
it=mp.erase(it);
}
mp[l]=v;
}
i32 perform(i32 l,i32 r) {
auto it=split(l);
split(r);
i32 ans=0;
i32 tm=0;
i32 prev=-1;
i32 pre=-1;
while (true) {
if (~pre) {
if (~prev) {
tm+=it->first-pre;
ans=std::max(ans,tm);
}else {
tm=0;
}
}
pre=it->first;
prev=it->second;
if (it->first==r) {
break;
}
it=std::next(it);
}
return ans;
}
};
void solve(){
i32 n,m;
cin>>n>>m;
ODT odt(1,n,0);
while (m--) {
i32 l,r;
cin>>l>>r;
odt.assign(l,r+1,-1);
}
std::cout<<odt.perform(0,n+1);
}

京公网安备 11010502036488号