首页 > 其他分享 >平衡树写题记录

平衡树写题记录

时间:2022-11-30 18:34:54浏览次数:66  
标签:记录 int treap tot 写题 maxn 平衡 fhq size

练思维的同时还是顺便点一下科技树吧。。。顺便fhq-treap好写好用,再也不用Splay了,反正不学LCT了。

这下面是实现大多数功能的fhq-treap板子

 1 mt19937 rnd(time(0));
 2 struct fhq_treap {
 3     int size[maxn],ls[maxn],rs[maxn],val[maxn],tot,wei[maxn],root;
 4     fhq_treap() {tot = 0;}
 5     int New(int v) {
 6         size[++tot] = 1;
 7         val[tot] = v;
 8         wei[tot] = rnd();
 9         return tot;
10     }
11     void pushup(int p) {size[p] = size[ls[p]] + size[rs[p]] + 1;}
12     void Split(int p, int v, int &x, int &y) {
13         if(!p) {x = 0; y = 0; return;}
14         if(val[p] <= v){x = p; Split(rs[p], v, rs[p], y);}
15         else {y = p; Split(ls[p], v, x, ls[p]);}
16         pushup(p);
17     }
18     int Merge(int x, int y) {
19         if((!x) || (!y)) return x + y;
20         if(wei[x] < wei[y]) {
21             ls[y] = Merge(x, ls[y]);
22             pushup(y);
23             return y;
24         }
25         else {
26             rs[x] = Merge(rs[x], y);
27             pushup(x);
28             return x;
29         }
30     }
31     void insert(int v) {
32         int x,y;
33         Split(root, v - 1, x, y);
34         root = Merge(Merge(x, New(v)), y);
35     }
36     void del(int v) {
37         int x,y,z;
38         Split(root, v, x, z);
39         Split(x, v - 1, x, y);
40         root = Merge(Merge(x, Merge(ls[y], rs[y])), z);
41     }
42     int find(int p, int kth) {
43         if(size[ls[p]] + 1 == kth) return p;
44         if(kth < size[ls[p]] + 1) return find(ls[p], kth);// 又写反了。。 
45         return find(rs[p], kth - size[ls[p]] - 1);
46     }
47     int rnk(int v) {
48         int x,y,ret;
49         Split(root, v - 1, x, y);
50         ret = size[x] + 1;
51         root = Merge(x, y);
52         return ret;
53     }
54     int pre(int v) {
55         int x,y,ret;
56         Split(root, v - 1, x, y);
57         ret = val[find(x, size[x])];
58         root = Merge(x, y);
59         return ret;
60     }
61     int nxt(int v) {
62         int x,y,ret;
63         Split(root, v, x, y);
64         ret = val[find(y, 1)];
65         root = Merge(x, y);
66         return ret;
67     }
68 }t;
fhq-treap

有下传标记操作就在split和merge递归开头pushdown就好了,区间树有时间再补

HNOI2002 营业额统计

链接 挺傻的一个题,set都能水过去,写个查前驱后继的平衡树就可以了,记得判重复

TJOI2007 书架

链接 还是比较简单的,考虑像map那样每个节点开两个值:字符串、排名。然后按排名为关键字排序就可以了。插入的时候按v-1分裂,像线段树那样给大一点的那棵树打上区间加标记,分裂合并时下传标记就可以了,查询跟rnk查值一样的,写个find就可以了。

标签:记录,int,treap,tot,写题,maxn,平衡,fhq,size
From: https://www.cnblogs.com/woshilaji/p/16939346.html

相关文章

  • 架构学习-记录003
                 ......
  • C# 记录类
    C#中的记录是一个类或结构,它为使用数据模型提供特定的语法和行为。在下列情况下,请考虑使用记录而不是类或结构:你想要定义依赖值相等性的数据模型。你想要定义对象不可......
  • easylogging++的那些事(四)源码分析(二)日志记录宏(四)VERBOSE日志宏
    目录CVLOG宏宏展开源码剖析CVLOG_EVERY_N宏宏展开源码剖析CVLOG_AFTER_N宏宏展开源码剖析CVLOG_N_TIMES宏宏展开源码剖析VLOG宏DCVLOG宏DVLOG宏VLOG_EVERY_N宏VLOG......
  • python multiprocessing使用容易遇到的坑记录随笔
    python因为有GIL(GlobalInterpreterLock)锁的问题,所以在计算密集型程序中,推荐使用multiprocessing多进程编程。在使用multiprocessing创建子进程时,很容易遇到一个不易发现......
  • Qt多线程开发总览,既然用到了就记录一下
    多线程在LBD_VM_Intercom中使用的一个简单的实例陶工给的dll需要进行异步操作才可以将视频画面附到窗体上,必须得在画面出现之后才可以附加画面,否则就有可能出现意外bug,所......
  • MybatisPlus 删除记录
    转自:https://blog.csdn.net/h470789634/article/details/124573252学习目标:mybatisplus的删除操作学习内容:delete使用学习产出:1、deleteById@Test   voiddeleteTes......
  • UMLChina答疑记录更新
    ·系统给某些人发消息或者处理·接口契约文档属于哪一个工作流·系统用例是否都从业务序列图映射·"宅男"组织应该是哪些价值的集合·想表示消息返回值为Cus......
  • stream用法记录
    转自:https://blog.csdn.net/sc179/article/details/126283897JavaStream类常见用法目录1基本过滤:返回学生列表中90分以上的2基本转换:根据学生列表返回名称......
  • 枚举小例子记录
    1、创建枚举类:packagecom.atguigu.common.constant;publicclassProductConstant{publicenumAttrEnum{ATTR_TYPE_BASE(1,"基本属性"),ATTR_TYPE_SALE......
  • 练字 行楷学习记录
    准备工作:0.7毫米中性笔1.5公分(不超过1.6)左右的格子纸,米字格-田字格-方字格-横写-竖写。执笔参考:练字前的准备(执笔)执笔要满足:握起来舒服不遮挡视线不影响长笔画书写......