「算法笔记」FHQ-Treap】的更多相关文章

FHQ Treap FHQ Treap (%%%发明者范浩强年年NOI金牌)是一种神奇的数据结构,也叫非旋Treap,它不像Treap zig zag搞不清楚(所以叫非旋嘛),也不像Splay完全看不懂,而且它能完成Treap与Splay能完成的所有事,代码短,理解也容易. 基本操作 FHQ Treap和Treap很像,都是给每个节点一个随机的权值,使它满足堆的性质.建议先了解Treap(没必要实现,懂得原理即可).不过,如果有两个节点值相同,FHQ Treap不会用一个数组cnt记录个数,而是…
一.引入 随机数据中,BST 一次操作的期望复杂度为 \(\mathcal{O}(\log n)\). 然而,BST 很容易退化,例如在 BST 中一次插入一个有序序列,将会得到一条链,平均每次操作的复杂度为 \(\mathcal{O}(n)\).我们称这种左右子树大小相差很大的 BST 是"不平衡"的. 有很多方法可以维持 BST 的平衡,从而产生了各种平衡树. Treap 就是常见平衡树中的一种. 二.简介 满足 BST 性质且中序遍历为相同序列的二叉查找树是不唯一的.这些二叉查找…
一.简介 前置知识:多项式乘法与 FFT. FFT 涉及大量 double 类型数据操作和 \(\sin,\cos\) 运算,会产生误差.快速数论变换(Number Theoretic Transform,简称 NTT)在 FFT 的基础上,优化了常数及误差. NTT 其实就是把 FFT 中的单位根换成了原根. NTT 解决的是多项式乘法带模数的情况,可以说有些受模数的限制,多项式系数应为整数. 二.原根 与 NTT 「算法笔记」基础数论 2 中提及了原根的部分内容. 对于质数 \(p\),若…
一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \(n\) 个员工,其中上下级的关系通过树形给出.每个人都不想与自己的直接上级同时参加聚会.每个员工都有一个欢乐度,举办聚会的你需要确定邀请的员工集合,使得它们的欢乐度之和最大,并且没有一个受邀的员工需要与他的直接上级共同参加聚会.\(n\leq 6000\). Solution: 考虑一个子树往上转…
一.定义 k-SAT(Satisfiability)问题的形式如下: 有 \(n\) 个 01 变量 \(x_1,x_2,\cdots,x_n\),另有 \(m\) 个变量取值需要满足的限制. 每个限制是一个 \(k\) 元组 \((x_{p_1},x_{p_2},\cdots,x_{p_k})\),满足 \(x_{p_1}\oplus x_{p_2}\oplus\cdots\oplus x_{p_k}=a\).其中 \(a\) 为 \(0\) 或 \(1\),\(\oplus\) 是某种二元…
一.前置概念 接下来的这些定义摘自 置换群 - OI Wiki. 1. 群 若集合 \(s\neq \varnothing\) 和 \(S\) 上的运算 \(\cdot\) 构成的代数结构 \((S,\cdot)\) 满足一下性质: 封闭性:\(\forall a,b\in S,a\cdot b\in S\). 结合律:\(\forall a,b,c\in S,(a\cdot b)\cdot c=a\cdot (b\cdot c)\). 单位元:\(\exists e\in S,\forall…
右转→https://www.cnblogs.com/mytqwqq/p/15057231.html 下面放个板子 (禁止莱莱白嫖板子) P3369 [模板]普通平衡树 #include<bits/stdc++.h> using namespace std; const int N=1e5+5; int n,op,x; struct Treap{ int rt,tot,lc[N],rc[N],val[N],sz[N],rnd[N]; void upd(int x){ sz[x]=sz[lc[x…
一.简介 Splay(伸展树)是平衡树中的一种.它通过不断将某个节点旋转到根节点的位置,使整棵树仍满足 BST 的性质,并且保持平衡而不至于退化为链. 频繁访问的节点会被移动到离根节点较近的位置,进而获得更快的访问速度. 可以通过均摊复杂度证明,\(n\) 个点,进行 \(m\) 次 Splay 操作,最终的时间复杂度是 \(\mathcal{O}((n+m)\log n)\).证明. 二.基本操作 一些维护的信息: \(rt\) \(tot\) \(fa(x)\) \(lc(x)\) \(rc…
一.关于状压 dp 为了规避不确定性,我们将需要枚举的东西放入状态.当不确定性太多的时候,我们就需要将它们压进较少的维数内. 常见的状态: 天生二进制(开关.选与不选.是否出现--) 爆搜出状态,给它们编号 1. 状态跟某一个信息集合内的每一条都有关.(如 dp 套 dp) 2. 若干条精简而相互独立的信息压在一起处理. (如每个数字是否出现) 在使用状压 dp 的题目当中,往往能一眼看到一些小数据范围的量,切人点明确.而有些题,这样的量并不明显,需要更深人地分析题目性质才能找到. 二.预备知识…
戳 这里(加了密码).虽然写的可能还算清楚,但还是不公开了吧 QwQ. 真的想看的 私信可能会考虑给密码 qwq.就放个板子: //LOJ 6053 简单的函数 f(p^c)=p xor c #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e6+5,mod=1e9+7; int n,s,tot,val[N],id1[N],id2[N],x,cnt,p[N],sum[N],g[N],h…
一.引入 首先,定义多项式的形式为 \(f(x)=\sum_{i=0}^n a_ix^i\),其中 \(a_i\) 为系数,\(n\) 为次数,这种表示方法称为"系数表示法",一个多项式是由其系数确定的. 可以证明,\(n+1\) 个点可以唯一确定一个 \(n\) 次多项式.对于 \(f(x)\),代入 \(n+1\) 个不同的 \(x\),得到 \(n+1\) 个不同的 \(y\).一个 \(n\) 次的多项式就可以等价地换成 \(n+1\) 个等式,相当于平面上的 \(n+1\)…
一.离散对数 给定 \(a,b,m\),存在一个 \(x\),使得 \(\displaystyle a^x\equiv b\pmod m\) 则称 \(x\) 为 \(b\) 在模 \(m\) 意义下以 \(a\) 为底的 离散对数. 二.BSGS 离散对数:求解关于 \(x\) 的方程 \(a^x\equiv b\pmod m\). 基本思想:(假设 \(\gcd(a,m)=1\),那么 \(a\) 在模 \(m\) 意义下存在逆元) 考虑类似分块的一个想法.首先设定一个常量 \(t\). 设…
一.简介 Link-Cut Tree (简称 LCT) 是一种用来维护动态森林连通性的数据结构,适用于动态树问题. 类比树剖,树剖是通过静态地把一棵树剖成若干条链然后用一种支持区间操作的数据结构维护,而 LCT 则是动态地去处理这个问题.这里引入实链剖分. 实链剖分: 与重链剖分类似,同样将与某一个儿子的连边划分为 实边,其余儿子的连边为 虚边. 对于一个点连向它儿子的所有边,选择⼀条边为实边,其他边为虚边.虚实之间是可以进行 转换 的.对于⼀条由实边组成的链,我们称之为 实链. 每个节点能且仅…
一.扩展欧几里得 求解方程 \(ax+by=\gcd(a,b)\). int exgcd(int a,int b,int &x,int &y){ if(!b) return x=1,y=0,a; int d=exgcd(b,a%b,x,y); int z=x; x=y,y=z-y*(a/b); return d; } 对于更为一般的方程 \(ax+by=c\),设 \(d=\gcd(a,b)\).我们可以求出 \(ax+by=d\) 的一组特解 \(x_0,y_0\).这所以 \(\fra…
一.数学期望 1. 由来 在 \(17\) 世纪,有一个赌徒向法国著名数学家帕斯卡挑战,给他出了一道题目:甲乙两个人赌博,他们两人获胜的机率相等,比赛规则是先胜三局者为赢家,一共进行五局,赢家可以获得 \(100\) 法郎的奖励.当比赛进行到第四局的时候,甲胜了两局,乙胜了一局,这时由于某些原因中止了比赛,那么如何分配这 \(100\) 法郎才比较公平? 甲输掉后两局的可能性只有 \(\frac{1}{2} \times \frac{1}{2}=\frac{1}{4}\),也就是说甲赢得后两局或…
一.关于数位 dp 有时候我们会遇到某类问题,它所统计的对象具有某些性质,答案在限制/贡献上与统计对象的数位之间有着密切的关系,有可能是数位之间联系的形式,也有可能是数位之间相互独立的形式.(如求满足条件的第 K 小的数是多少,或者求在区间 [L,R] 内有多少个满足限制条件的数等) 常见的在 dp 状态中需要记的信息:当前位数.与上界之间的关系(从高到低做这个信息为 0/1,即当前与上界相等/小于上界.往往数位 dp 的对象是 0 到某个上界 R,为了统计这个范围的信息,我们需要保证从高位往低…
「学习笔记」Treap 前言 什么是 Treap ? 二叉搜索树 (Binary Search Tree/Binary Sort Tree/BST) 基础定义 查找元素 插入元素 删除元素 查找后继 平衡性问题讨论 经典例题 堆 (Heap) 查询操作 插入操作 删除操作 随机二叉查找树 (Treap) 基础定义 Treap 维护平衡的原理--旋转操作 插入操作 删除操作 其他操作 调试技巧 前言 HuaQiMoAo 大佬 GuoShaoYang 大佬 且部分图片可能来源于这两位大佬. 本人太菜…
「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}​\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK}​\) 了,为了向 \(\text{AK}​\)王 学习,真诚的膜拜他,接受红太阳的指导,下午就学习了一下 \(\text{Min25}​\) 筛. 简介 如果 \(f(n)\) 是一个积性函数,且 \(f(n)\) 是一个关于 \(n\) 的简单多项式,并可以快速算出 \(f(p^k),\ p\…
「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border}\) 思路 代码 \(\text{KMP}\) 匹配 思路 代码 Trie 数据结构 01-Trie 代码 练习题 Hash Bovine Genomics 思路 代码 [TJOI2018]碱基序列 思路 代码 [CQOI2014]通配符匹配 [NOI2017] 蚯蚓排队 思路 代码 KMP See…
目录 「学习笔记」FFT 之优化--NTT 前言 引入 快速数论变换--NTT 一些引申问题及解决方法 三模数 NTT 拆系数 FFT (MTT) 「学习笔记」FFT 之优化--NTT 前言 \(NTT\) 在某种意义上说,应该属于 \(FFT\) 的一种优化. --因而必备知识肯定要有 \(FFT\) 啦... 如果不知道 \(FFT\) 的大佬可以走这里 引入 在 \(FFT\) 中,为了能计算单位原根 \(\omega\) ,我们使用了 \(\text{C++}\) 的 math 库中的…
目录 「学习笔记」FFT 快速傅里叶变换 啥是 FFT 呀?它可以干什么? 必备芝士 点值表示 复数 傅立叶正变换 傅里叶逆变换 FFT 的代码实现 还会有的 NTT 和三模数 NTT... 「学习笔记」FFT 快速傅里叶变换 几个星期之后,继 扩展欧拉定理 之后, \(lj\) 大佬又给我们来了一发数论... 虽然听得心态爆炸, 但是还好的是没有 \(ymx\) 大佬的飞机开得好... 至少我还没有坐飞机... 啥是 FFT 呀?它可以干什么? 首先,你需要知道 矩阵乘法 的相关知识. 通过…
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Codeforces 896C C. Willem, Chtholly and Seniorious 国外珂学家 滑稽) 前置芝士: set的基本操作 迭代器(跟指针差不多 重载运算符.构造函数的简单了解 mutable(下面也会讲 暴力枚举 常数优化(inline O2 O3 register大法好啊…
[学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \leq k \leq n \leq 10^5, -10^9 \leq a_i \leq 10^9\) 先假装都会 \(1 \leq k \leq n \leq 1000\) 的 \(dp\) 做法以及 \(k = 1\) 的子问题 实际上这个问题还可以是个费用流模型: 对于序列中每一个点 \(i\)…
问题引入 先让我们看一个简单的问题,有N个元素,Q次操作,每次操作需要求出一段区间内的最大/小值. 这就是著名的RMQ问题. RMQ问题的解法有很多,如线段树.单调队列(某些情况下).ST表等.这里主要探讨ST表 过程 ST表是一种神奇的算法,它以倍增与二进制为基础,实现区间内最大/小值.话不多说,直接切入正题-- 我们这里以求区间最大值为例. 首先,我们可以用O(\(N lg N\))的时间复杂度预处理出以i开始,接下来2j个元素中的最大值.我们借助递推/DP的思想. for ( int i…
引入 假设我们想计算 \(f(x) = x!\).除了简单的 for 循环,我们也可以使用递归. 递归是什么意思呢?我们可以把 \(f(x)\) 用 \(f(x - 1)\) 表示,即 \(f(x) = x \times f(x - 1)\).这样,我们就可以不断地递归下去. 但是,这是永远不会停止的.我们需要设立一个边界条件,\(f(0) = 1\).这样,我们就可以写出代码了. int f(int x) {return x ? x * f(x - 1) : 1;} 实际上,递归有两大要点:…
前置姿势 魔力筛 其实不看也没关系 用途和限制 在\(\mathrm{O}(\frac{n^{0.75}}{\log n})\)的时间内求出一个积性函数的前缀和. 所求的函数\(\mathbf f(x)\)要满足以下条件: \(\mathbf f(p)\)是一个多项式,其中\(p\)是质数 \(\mathbf f(p^c)\)要能够快速计算. 算法流程 首先我们需要求出对于每一个\(\left\lfloor \frac ni\right\rfloor\)求出\(\sum_{i=1}^x [i \…
前言 快速傅里叶变换(\(\text{Fast Fourier Transform,FFT}\) )是一种能在\(O(n \log n)\)的时间内完成多项式乘法的算法,在\(OI\)中的应用很多,是多项式相关内容的基础.下面从头开始介绍\(\text{FFT}\). 前置技能:弧度制.三角函数.平面向量. 多项式 形如\(f(x)=a_0+a_1x+a_2x^2+...+a_nx^n\)的式子称为\(x\)的\(n\)次多项式.其中\(a_0,a_1,...,a_n\)称为多项式的系数. 系数…
前言 快速傅里叶变换(\(\text{Fast Fourier Transform,FFT}\) )是一种能在\(O(n \log n)\)的时间内完成多项式乘法的算法,在\(OI\)中的应用很多,是多项式相关内容的基础.下面从头开始介绍\(\text{FFT}\). 前置技能:弧度制.三角函数.平面向量. 多项式 形如\(f(x)=a_0+a_1x+a_2x^2+...+a_nx^n\)的式子称为\(x\)的\(n\)次多项式.其中\(a_0,a_1,...,a_n\)称为多项式的系数. 系数…
目录 算法 例题 任务安排 题意 思路 代码 [SDOI2012]任务安排 题意 思路 代码 任务安排 再改 题意 思路 练习题 [HNOI2008]玩具装箱 思路 代码 [APIO2010]特别行动队 思路 代码 [ZJOI2007]仓库建设 思路 代码 [USACO08MAR]Land Acquisition G 思路 代码 算法 把一些 dp 的转移方程拆一拆,移一移,能拆成 \(y=kx+b\) 的形式(其中 \(k,b\) 只与当前的 \(i\) 有关,\(x,y\) 只与 \(j\)…
目录 算法 例题 最大子段和 题意 思路 代码 修剪草坪 题意 思路 代码 瑰丽华尔兹 题意 思路 代码 股票交易 题意 思路 代码 算法 使用单调队列优化dp 废话 对与一些dp的转移方程,我们可以通过拆使它与某个区间的最值相关. 这时可以用单调队列算出区间最值,进行优化. 例题 最大子段和 题意 给出一个长度为 \(n\) 的整数序列,从中找出一段长度不超过 \(m\) 的连续子序列,使得整个序列的和最大. 思路 设 \(sum_i\) 为 \(i\) 的前缀和,易得答案为: \[\max_…