随笔分类 - 数据结构
摘要:主要是讲两个东西: CDQ分治&整体二分 CDQ分治 [模板] 三维偏序 离线——CDQ分治 一维偏序就是归并排序求逆序对?Yes 好,再加一维: 处理这一维我们考虑std::sort水掉这一维, 剩下的一维就直接维护一个树状数组查询即可 好,再加一维: 既然主题是分治的话,就直接用吧 分治流程:
阅读全文
摘要:可持久化线段树&主席树 似乎学到了一点点 主席树——可持久化权值线段树 于是就正式开坑了 权值线段树 权值线段树是维护值域信息的线段树 在一个数组$a$上建权值线段树, 每个节点维护的是区间$[l,r]$中,每个数据出现的次数 可持久化 可持久化基于的是一个原理: 继承前后修改中不变的数据 于是我们
阅读全文
摘要:动态开点 动态开点是对一个不完整区间开线段树 对于这个区间开一颗正常线段树即可 但是一个问题就是不一定是直接完全二叉树规则 所以要记录左右节点儿子编号 区间由函数传参传入 一般是用于值域太大而查询范围比较小的情况 线段树合并 重新开一颗线段树,保存两棵线段树的信息 递归左右子节点即可 如果线段树A有
阅读全文
摘要:动态区间问题 一般见到这些个,传统做法就Splay和无旋Treap 然后一个基本的原理就是: 平衡树的中序遍历必须和原序列一致 然后其实这个也挺简单 区间插入 这个Splay可以干: 区间左端点Splay到根 右端点Splay到右儿子 然后插到端点左儿子即可 区间翻转 首先找到对应区间 还是这个操作
阅读全文
摘要:BST 二叉查找树的定义: 一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; 从上述定义可以看出BST的性质: BST中序遍历的序列权值递增
阅读全文
摘要:板子 无旋Treap 点击查看代码 #include <bits/stdc++.h> using namespace std; const int o=2222222; struct Treap{ struct node{ int l,r; int size; int val; int k; }t[
阅读全文
摘要:分块 分块的基本思想: 以空间换时间和平衡时空复杂度 用处:维护区间信息 同线段树相比,分块的时间复杂度要高一些,换来的是灵活性和通用性 ~~(当然更难调......)~~ 根号分块 这里是已知用分块的时空复杂度去算块长,假定块长为 $K$ 这里的原理就是上边说的平衡时空复杂度 其实最主要的应用位置
阅读全文
摘要:权值线段树维护值域上每个数字出现的次数,与线段树合并,当规模过大的时候只需要开一部分节点,即为动态开点
阅读全文

浙公网安备 33010602011771号