算法复习6.5FHQ

struct NODE{
  int val,cnt,rev,prio,size,ch[2];
};
struct FHQ{
  int root,size,NODE node[maxn];
}
pair<int, int> split_by_val (int t,int val){
if(!t){return{0,0};}
check_rev(t);
if(node[t].val<=val){
  auto tmp=split_by_val(node[t]0p.ch[1],val);
  node[t].ch[1]=tmp.first;
  update_size(t);
  return(t,tmp.second);
}else{
  auto tmp=split_by_val(node[t].ch[0],val);
  node[1].ch[0]=tmp.second;
  update_size;
  return {tmp.first,t};
}
}
tuple<int,int,int>split_by_rank(int t,int k){
  if(!t){return{0,0,0};}

check_rev(t);
int lt,mt,rt;
if(k<=node[node[t].ch[0]].size){
  tie(lt,mt,rt)=split_by_rank(node[t].ch[0].k);
  node[t].ch[0]=rt
  update_size(t);
  return{lt,mt,rt};
}else if(k>node[node[t].ch[0]].size+node[t].cnt){
  tie(lt,mt,rt)=split_by_rank(node[t].ch[1],k-node[node[t].ch[0]].size-node[t].cnt)];
  node[t].ch[1]=lt;
  update_size(t);
  return(t,mt,rt);
}else{
  lt=node[t].ch[0];
  rt=node[t].ch[1];
  check_rev(lt);
  check_rev(rt);
  update_size;
  return{lt,t,rt};
}
}
merge(int lt,int rt){
  if(!t){
    return rt;
  }else if(!rt){
    return lt;
  }
  check_rev(lt);
  check_rev(rt);
  if(node[lt].prio<node[rt].prio){
    node[lt].ch[1]=merge(node[lt].ch[1],rt);
    update_size(lt);
    return lt;

  }else{
    node[rt].ch[0]=merge(lt,node[rt.ch[0]);
    update_size(rt);
    return rt;
  }
}
void insert(int val){
  int lt,mt,rt;
  tie(lt,rt)=split_by_val(root,val);
  tie(lt,mt)=split_by_val(lt,val-1);
  if(!mt){
    mt=new_node(val);
  }else{
    node[mt].cnt++;
    update_size(mt);
  }
  root=merge(merge(lt,mt,rt));
}
void del(int val){
  int lt,mt,rt;
  tie(lt,rt)=split_by_val(root,val);
  tie(lt,mt)=split_by_val(lt,val-1);
  node[mt].cnt--;
  update_size(mt);
  if(node[mt].cnt==0){
    clear(mt);

  }else{
    lt=merge(lt,mt);
  }
  root=merge(lt,rt);

}
void reverse(int l,int r){
  int t1,t2,t3,t4,t5;
  tie(t1,t2,t3)=split_by_rank(root,l-1);
  tie(t3,t4,t5)=split_by_rank(t3,r-l+2);
  node[t3].rev=1;
  root=merge(merge(merge(merge(t1,t2),t3),t4),t5);
}
void check_rev(int t){
  if(node[t].rev){
    swap(node[t].ch[0],node[t].ch[1]);
    node[node[t].ch[0]].rev^=1;
        node[node[t].ch[1]].rev^=1;
node[t].rev=0
  }
}
int rank(int val){
  auto tmp=split_by_val(root,val-1);
  int k =node[tmp.first].size+1;
  root=merge(tmp.first,tmp.second);
  return k;
  }
  int kth(int &t,int k){
    int lt,mt,rt;
    tie(lt,mt,rt)=split_by_rank(t,k);
    int val=node[mt].val;
    t=merge(merge(lt,mt),rt);
    return val;
  }
  int pre(int val){
    auto tmp=split_by_rank(root,val-1);
    int k=kth(tmp.first,node[tmp.first].size);
    root=merge(tmp.first,tmp,second);
    return k;
  }
  int nxt(int val){
    auto tmp=split_by_val(root,val);
    int k=kth(tmp.second,1);
    root=merge(tmp.first,tmp.second);
    return k;
  }

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HineMusk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值