2023.10.11 闲话

_


完全可追溯化随机访问双端队列

维护一个双端队列的操作序列,支持以下修改 / 询问:

  1. Insert(t,pushL(x)),在第 t 次操作后插入将元素 x 从左端加入双端队列操作 .
  2. Insert(t,pushL(x)),在第 t 次操作后插入将元素 x 从右端加入双端队列操作 .
  3. Insert(t,popL()),在第 t 次操作后插入弹出左端第一个数操作 .
  4. Insert(t,popR()),在第 t 次操作后插入弹出右端第一个数操作 .
  5. Delete(t),删除第 t 次操作 .
  6. Query(t,i),询问 t 时刻后双端队列中 i 位置的值 .

考虑分别维护被 pushL(x) 插入的元素和被 pushR(x) 插入的元素 . 考虑双端队列的一种实现方式:维护序列 {a},初始 l=1,r=0

  • pushL(x)ll1al=x .
  • pushR(x)rr+1ar=x .
  • popL()ll+1 .
  • popR()rr1 .

那么一次询问只需要知道 iai 就行了 . 维护两棵平衡树 TL,TR,对应平衡树只存对应的 push,pop 操作,权值分别为 1,1 . 那么求 t 时刻的 i 值只需要在平衡树上求一下前缀和就可以了 .

ai 的值肯定是最后一次 pushL(x)l=i 的操作或者最后一次 pushR(x)r=i 的操作,分别平衡树二分后比较即可 .

时间复杂度单次操作 O(logm) .

ZG

posted @   yspm  阅读(26)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
😅​
点击右上角即可分享
微信分享提示