「模板」Splay】的更多相关文章

代码说明 对于一些变量进行说明: 变量名 说明 rt 树根 ff[u] 点 \(u\) 的父节点,特别地, ff[rt]=0 ch[u][0|1] 点 \(u\) 的 左/右儿子 siz[u] 点 \(u\) 及其子树大小 val[u] 点 \(u\) 对应的值 recy[u] 点 \(u\) 对应的 val[u] 出现的次数 代码 #include<cstdio> #include<vector> using namespace std; #define rep(i,__l,__…
「模板」 FHQ_Treap 我也是偶然发现我还没发过FHQ_Treap的板子. 那就发一波吧. 这个速度实在不算快,但是不用旋转,并且好写. 更重要的是,Splay 可以做的事情它都可以做!比如区间操作,以及LCT相关- 而且它还可以可持久化!(虽然目前还没有学) Capella 认为,不涉及区间操作时,用快一些的平衡树(SBT/Treap/替罪羊...)较好,涉及区间操作而又不想写大量代码的话,FHQ_Treap 不失为一种极好的选择. 下一篇写 FHQ_Treap 的区间操作. #incl…
「模板」 线段树--区间乘 && 区间加 && 区间求和 原来的代码太恶心了,重贴一遍. #include <cstdio> int n,m; long long p; class SegmentTree { private: struct Node { int l,r; long long v,mul,add; Node *c[2]; Node(int l,int r):l(l),r(r),mul(1LL),add(0LL) { c[0]=c[1]=nullp…
「模板」 FHQ_Treap 区间翻转 没有旋转的 Treap 实现区间操作的功能,很好理解,也很好写,只是速度不算太快. 对于要翻转的区间,把整棵 Treap(存有区间 \([1,n]\) 的信息)Split 成 \([1,l-1]\).\([l,r]\).\([r+1,n]\) 三部分,给中间部分的根节点打上标记,再一边下传标记一边 Merge 回来. 注意 Split 时,要按元素个数,不能按权值,因为元素个数可以通过维护节点信息的 size 域而直接得到,但随着区间的翻转,权值会乱套.…
「模板」 树链剖分 HLD 不懂OOP的OIer乱用OOP出人命了. 谨此纪念人生第一次类套类. 以及第一次OI相关代码打过200行. #include <algorithm> #include <cstdio> #include <cstring> using std::swap; const int MAXN=100010,MAXM=200010; int n,m,rt,P; class HLD { public: HLD(void) { num=cnt=0; me…
Treap实现名次树 前言 学平衡树的过程可以说是相当艰难.浏览Blog的过程中看到大量指针版平衡树,不擅长指针操作的我已经接近崩溃.于是,我想着一定要写一篇非指针实现的Treap的Blog. 具体如下. 简介 Treap(树堆,Tree+Heap)是一种强大的数据结构--每个节点除了本身键值(v)之外,附有一个随机优先级(p),其中v满足二叉搜索树性质,p满足堆性质(下文中为大根堆),通过旋转操作来维护性质,并使整棵树保持平衡. 名次树 顾名思义就是可以查找x的排名.查找第x名的值.查找前驱与…
目录 说明 普通版本 询问更改版 拓扑优化版本 说明 这篇博客只挂模板,具体分析请膜拜大佬 hyfhaha 大佬. 普通版本 题目传送门 #include<cstdio> #include<queue> #include<cstring> using namespace std; #define rep(i,__l,__r) for(signed i=__l,i##_end_=__r;i<=i##_end_;++i) #define fep(i,__l,__r)…
老师用的是静态数组的写法,开了很多数组- 其实个人更倾向于 struct 或者用 class 封装起来. 但是鉴于太难打 好吧,是我懒得打. 然后就借鉴了老师的模板,写出了属于自己的 压行 风格. 代码见下:(注:题目是洛谷P3835) #include<cstdio> #include<cstdlib> #define rep(i,__l,__r) for(int i=__l,i##_end_=__r;i<=i##_end_;++i) #define fep(i,__l,_…
\(\mathcal{Description}\)   Link.   \(T\) 组询问,每次给出 \(n,a,b,c,k_1,k_2\),求 \[\sum_{x=0}^nx^{k_1}\left\lfloor\frac{ax+b}{c}\right\rfloor^{k_2}\bmod(10^9+7) \]   \(T=1000\),\(n,a,b,c\le10^9\),\(0\le k_1+k_2\le 10\). \(\mathcal{Solution}\)   类欧模板题的集大成者.  …
\(\mathcal{Description}\)   Link.   给定字符串 \(s\),处理 \(q\) 次操作: 在 \(s\) 前添加字符串: 在 \(s\) 后添加字符串: 求 \(s\) 的所有非空回文子串数目.   任意时刻 \(|s|\le4\times10^5\),\(q\le10^5\). \(\mathcal{Solution}\)   双向 PAM 模板题.   思考一个正常的 PAM 所维护的--一个 DFA,每个结点的连边代表左右各加同一个字符:还有一个 fail…
\(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个结点的带权树,\(m\) 次单点点权修改,求出每次修改后的带权最大独立集.   \(n,m\le10^5\). \(\mathcal{Solution}\)   不考虑修改,显然 DP.令 \(f(u,0/1)\) 表示选 / 不选结点 \(u\),\(u\) 子树内的带权最大独立集.那么: \[\begin{cases}f(u,0)=\sum_v\max\{f(v,0),f(v,1)\}\\f(u,…
不想多说什么了.费空间,也不算太快,唯一的好处就是好写吧. #include <cstdio> #include <cstring> const int MAXN=100010<<5,INF=10000000; int n; class Trie { public: Trie(void) { cnt=1; memset(s,0,sizeof s); } void Insert(int x) { int k=1,p=x+INF; for(int i=30,t;~i;++s…
#include <algorithm> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int MAXN=160,MAXM=11000,MAXL=1000010; char str[MAXN][80],p[MAXL]; int n; class ACAM { public: void Init(void) { tot=0; memset(cnt…
话不多说上代码. Ford-Fulkerson(FF) #include <algorithm> #include <climits> #include <cstdio> #include <cstring> using namespace std; const int MAXN=100010,MAXM=200010; bool vis[MAXN]; int n,m,S,T,cnt,ans,head[MAXN]; struct edge { int nxt,…
问题描述 LG3389 题解 高斯消元,是用来解\(n\)元一次方程组的算法,时间复杂度\(O(n^3)\) 这样就构造出了这个方程组的矩阵 目标就是把这个矩阵左边\(n \times n\)消为单位矩阵 \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; void read(int &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch<'0'||ch&…
问题描述 LG5357 题解 不是fail树的AC自动机复杂度是假的. 把AC自动机搞出来,建立Trie树,树上爆搜一遍就好了. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch>'9'||ch<'0')) c…
问题描述 LG3812 题解 线性基是一类擅长解决异或问题的数据结构(也不算数据结构吧...就是一种玄学的东西) 对于数列 \(a\) ,它的线性基 \(d\) 为 出现 \(1\) 的最高位在第 \(i\) 位的数 (这里借用了"帅到报警"的题解). 构造方法 对于每一个尝试插入的数 \(x\) ,找出它目前为 \(1\) 的最高位 \(pos\) . 如果这个时候 \(d_pos\) 已经有了一个数,那么就把 \(x\) 异或上 \(d_pos\) 继续尝试. 否则插入,插入成功后…
问题描述 LG5367 题解 康托展开公式: \[ans=1+(\sum_{i=1}^{n}{a_i})\times(n-i)!\] 用树状数组维护一下\(\sum\)里面的东西,前缀积维护后面的东西. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; template <typename Tp> void read(Tp &x){ x=0;char ch=1;int fh; while(ch!='…
问题描述 LG4782 题解 对于一个限制条件,建边如下: 如果\(x,-x\)在同一个强联通分量里,则不行,否则可以 构造方案:输出\(bel_i<bel_{i+n}\) \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; void read(int &x){ x=0;char ch=1;int fh; while(ch!='-'&&(ch<'0'||ch>'9')) ch=g…
\(\mathcal{Description}\)   Link.   给定 \(n\) 个点 \((x_i,y_i)\),求一个不超过 \(n-1\) 次的多项式 \(f(x)\),使得 \(f(x_i)\equiv y_i\pmod{998244353}\).   \(n\le10^5\). \(\mathcal{Solution}\)   摆出 Lagrange 插值的式子: \[f(z)=\sum_{i=1}^ny_i\prod_{j\neq i}\frac{z-x_j}{x_i-x_j…
\(\mathcal{Description}\)   Link.   给定二分图 \(G=(V=X\cup Y,E)\),\(|X|=|Y|=n\),边 \((u,v)\in E\) 有权 \(w(u,v)\),且保证存在完美匹配.求 \(G\) 的一个匹配 \(M\),最大化 \(\sum_{(u,v)\in M}w(u,v)\).   \(n\le500\). \(\mathcal{Solution}\)   首先我会费用流.   Kuhn-Munkres 算法,能够在 \(\mathca…
\(\mathcal{Description}\)   Link.   给定 \(n\) 次多项式 \(F(x)\),在模 \(998244353\) 意义下求 \[G(x)\equiv\left\{\left[1+\ln\left(2+F(x)-F(0)-\exp \int \frac{1}{\sqrt{F(t)}}\text dt\right)\right]^k\right\}'\pmod{x^n} \] 其中保证 \(F(0)\) 是模数的二次剩余,开根取模意义下较小常数项值.   \(n…
\(\mathcal{Description}\)   Link.   给定一个 \(n\) 个点 \(m\) 条边的仙人掌,\(q\) 组询问两点最短路.   \(n,q\le10^4\),\(m\le2\times10^4\). \(\mathcal{Solution}\)   提出一个环来考虑,从环上一点 \(u\) 到 \(v\),无非两条路径.可以按顺序处理一个前缀和.如图:   令 \(sum_2\) 为结点 \(1\) 到 \(2\) 的顺时针距离,\(sum_3\) 为结点 \(…
\(\mathcal{Description}\)   Link.    \(n\) 个结点的图,\(m\) 条形如 \((u,v,l,r)\) 的边,表示一条连接 \(u\) 和 \(v\) 的无向边会在时间 \((l,r]\) 内存在,时间范围在 \([0,K]\).判断每个时刻的图是否是二分图.   \(n,K\le10^5\),\(m\le2\times10^5\). \(\mathcal{Solution}\)   线段树分治其实和线段树没啥关系.(   个人感觉线段树分治节约时间的方…
题目描述 给定n个整数构成的序列,将对于指定的闭区间查询其区间内的第k小值. 输入输出格式 输入格式 第一行包含两个正整数n,m,分别表示序列的长度和查询的个数. 第二行包含n个整数,表示这个序列各项的数字. 接下来m行每行包含三个整数l,r,k, 表示查询区间[l,r]内的第k小值. 输出格式 输出包含m行,每行一个整数,依次表示每一次查询的结果 输入输出样例 输入样例 5 5 5957 6405 15770 26287 26465 2 2 1 3 4 1 4 5 1 1 2 2 4 4 1…
  进阶篇戳这里. 目录 何为「多项式」 基本概念 系数表示法 & 点值表示法 傅里叶(Fourier)变换 概述 前置知识 - 复数 单位根 快速傅里叶正变换(FFT) 快速傅里叶逆变换(IFFT) 迭代实现 例题 「洛谷 P3803」「模板」多项式乘法(FFT) 题意简述 数据规模 快速数论变换(NTT) 原根 实现 NTT 模数 奇怪的模数 - 任意模数 NTT 三模 NTT 拆系数 FFT(MTT) 七次转五次 五次转四次 例题 「洛谷 P4245」「模板」任意模数 NTT 题意简述 数…
Descrption OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资.如果他心情好,就可能把每位员工的工资加上一个相同的量.反之,如果心情不好,就可能把他们的工资扣除一个相同的量.我真不知道除了调工资他还做什么其它事情. 工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司…
[Luogu 3701] 「伪模板」主席树 这是一道网络流,不是主席树,不是什么数据结构,而是网络流. 题目背景及描述都非常的暴力,以至于 Capella 在做此题的过程中不禁感到生命流逝. S 向 byx 的树中的每一个人连有向边,手气君的树中的每一个人向 T 连有向边,边权为这个人的寿命.统计同一棵树中的膜法师数量 x.如果一个人是主席,那么边权要加上 x.(续得好啊) 然后,如果 byx 树中的一个点 i 能赢手气君树中的点 j,那么连 i->j,边权为 1. 跑最大流,最终答案为 min…
「luogu3380」[模板]二逼平衡树(树套树) 传送门 我写的树套树--线段树套平衡树. 线段树上的每一个节点都是一棵 \(\text{FHQ Treap}\) ,然后我们就可以根据平衡树的基本操作以及线段树上区间信息可合并的性质来实现了,具体细节看代码都懂. 参考代码: #include <algorithm> #include <cstdlib> #include <cstdio> #define rg register #define file(x) freo…
「luogu3402」[模板]可持久化并查集 传送门 我们可以用一个可持久化数组来存每个节点的父亲. 单点信息更新和查询就用主席树多花 一个 \(\log\) 的代价来搞. 然后考虑如何合并两个点. 由于我们要做到可持久化,所以我们就考虑用启发式合并. 至于路径压缩,ta好像会因为某些原因而MLE和TLE 其实我也没试过 那么我们在合并的时候就只需要借助主席树完成单点查询和修改就好了. 注意一个地方值得注意,就是在修改时因为我们的线段树是可持久化的,所以会通向之前版本的节点,所以不要覆盖之前的信…