模板:珂朵莉树

所谓珂朵莉树,就是珂朵莉发明的树。

(逃

前言

数据随机且带区间推平操作时适用,此时所有操作的期望颜色段数都是 O ( log ⁡ n ) O(\log n) O(logn) 的,可以使用暴力解决即可。
暴力即优雅。

解析

利用 set 维护颜色段:

struct node{
  int l,r;
  ll v;
  node(int L=0,int R=0,ll V=0):l(L),r(R),v(V){}
  bool operator < (const node &oth)const{return l<oth.l;}
};
bool cmp(const node &x,const node &y){
  return x.v<y.v;
}
set<node>s;

split

分裂出以 p p p 为左端点的颜色段,并返回迭代器。

It split(int p){
  It it=s.lower_bound((node){p,0,0});
  if(it!=s.end()&&(*it).l==p) return it;
  it--;
  if((*it).r<p) return s.end();
  int l=(*it).l;
  int r=(*it).r;
  ll v=(*it).v;
  s.erase(it);
  s.insert((node){l,p-1,v});
  return s.insert((node){p,r,v}).first;
}

assign

( l , r ) (l,r) (l,r) 区间颜色推平。
必须先 s p l i t ( r + 1 ) split(r+1) split(r+1),再 s p l i t ( l ) split(l) split(l),不然可能会RE!
然而由于随机数据,RE的概率其实不大。

inline void assign(int l,int r,int w){
  It itr=split(r+1),itl=split(l);
  s.erase(itl,itr);
  s.insert((node){l,r,w});
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值