题解:AT_abc435_e [ABC435E] Cover query
题目大意
有
做法
看到区间推平,容易想到 ODT。\ 赛时看到本题的操作只有区间推平,于是就写了用 set 维护连续的黑色段。\ 先贴一下核心代码。
//ss 是一个维护结构体 range(区间)的 set,range 基于 r 比较
while(q--){
int l,r;
read(l),read(r);
auto t=ss.lower_bound(range{l,l});//找到第一个会被删除的区间
#define y (*t)
for(;t!=ss.end();){
if(y.l>r) break;
cmin(l,y.l);
cmax(r,y.r);
//这两行的作用可以画个图,即两区间相交,最后的黑色的范围是两个区间并起来。
ans+=y.r-y.l+1;//维护答案
t=ss.erase(t);//erase 的返回值是下一个元素
}
ans-=r-l+1;
ss.insert(t,{l,r});
printf("%d\n",ans);
}
我们来尝试证明这个做法的复杂度。定义势能函数 ss.size()。每次插入操作最多使 inesrt 或 erase。而在 set 根据迭代器插入或删除都是 lower_bound,整个代码复杂度为
拓展
介绍一个颜色段均摊理论的小应用。\
如果本题加强为求区间 应该没有这样的人吧。我们也可以用颜色段均摊理论将区间推平转化为区间加。\
具体做法为用 set 维护区间白色连续段,对于在区间中的白色的连续段,在 set 中删除,在线段树上区间加。\
该做法在此题可能没有什么价值,但有些题目的性质可能没有这么好,这种用 ODT 来维护其他数据结构的办法有一定的作用。\
需要用的题目先咕着。