模板汇总——splay】的更多相关文章

#define lch(x) tr[x].son[0] #define rch(x) tr[x].son[1] ; , root; struct Node{ ], pre, sz; void init(){ sz = ; son[] = son[] = pre = ; } }tr[N]; void Push_Rev(int x){ if(!x) return ; swap(lch(x), rch(x)); tr[x].rev ^= ; } void Push_up(int x){ if(!x)…
原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设点 y 原是点 x 的 father,旋转操作可以在不改变中序遍历的基础上,将 y 变成 x 的儿子.例如: 旋转后: 代码: int wson(int x){ return son[fa[x]][1]==x; } void pushup(int x){ tot[x]=cnt[x]+tot[son[…
代码说明 对于一些变量进行说明: 变量名 说明 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,__…
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的. 设road[i][j]表示相邻的i到j的路长U集合存储已经求得的到源点最短路径的节点,S集合表示还没求得的节点dis[i]表示i到源节点(设为0)的最短路径vis[i]=1表示i节点在U集合中 刚开始dis[0]=0,vis[0]=1;dis[i]=maxn,vis[i]=0;for 1 to…
简介 二叉搜索树, 可以维护一个集合/序列, 同时维护节点的 \(size\), 因此可以支持 insert(v), delete(v), kth(p,k), rank(v)等操作. 另外, prev(v) == kth(rt,rank(v)-1); next(v) == kth(rt,rank(v)+1). 平衡树通过各种方法保证二叉搜索树的平衡, 从而达到 \(O(\log n)\) 的均摊复杂度. Splay Splay 不仅可以实现一般平衡树的操作, 还可以实现序列的翻转/旋转等操作.…
题目大意:维护一个长度为 N 的序列,支持单点插入,单点询问. 注意事项如下: build 函数中要记得初始化 fa. 插入两个端点值. 代码如下 #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define all(x) x.begin(),x.end() using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const…
Splay 均摊复杂度证明见此处 \(\rightarrow\) 链接 代码如下 #include <bits/stdc++.h> using namespace std; const int maxn=1e5+10; const int inf=0x3f3f3f3f; struct node{ #define ls(x) t[x].ch[0] #define rs(x) t[x].ch[1] int fa,ch[2],val,size,cnt; }t[maxn]; int tot,root;…
rentenglong大佬写的splay的梳理使我受益颇丰,特此做出一定的总结. 数据结构 定义了一个struct结构体. 为了在splay操作下储存根节点,我们宏定义了root 为 tree[0].ch[1],则我们把tree[0]看作了整棵树的超级根,而tree[0]的右儿子为排序树的根节点,那么一定有tree[0].v < tree[tree[0].ch[1]].v,所以我们需要将tree[0].v赋值为无穷小. struct Node{ int v, father; //v 保存的值,…
图论 数据结构 数学 其他: 洛谷模板:a,b两个字符串,求b串在a串中出现的位置 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ],s2[]; ]; int main(){ scanf(,s2+); len1=strlen(s1+);len2=strlen(s2+); ,k=;i<=len2;i++){ ]&&k>;k=Next[k]);…
气死我了,调了一个下午+两节课,各种大大小小的错误,各种调QAQ,最后总之是调出来了. 其实就是一个双旋操作,然后其他就是左儿子<当前节点<右儿子,剩下就是细节了. 题干: 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入xxx数 删除xxx数(若有多个相同的数,因只删除一个) 查询xxx数的排名(排名定义为比当前数小的数的个数+++.若有多个相同的数,因输出最小的排名) 查询排名为xxx的数 求xxx的前驱(前驱定义为小于xxx,且最大的数) 求x…
link-cut tree #define lch(x) tr[x].son[0] #define rch(x) tr[x].son[1] ; struct Node{ int rev, rt; ], pre; int mx, val, id; void init(){ rt = ; rev = pre = son[] = son[] = ; mx = val = id = ; } }tr[N]; void Push_Rev(int x){ if(!x) return ; swap(lch(x)…
1. kmp 相当于往前求出一段字符信息,使得 这段字符信息和前缀相等. void getnext(){ , j = ; nx[] = -; while(j < m){ || b[j] == b[k]) nx[++j] = ++k; else k = nx[k]; } } 例: T #include<iostream> using namespace std; +], b[+], a[+]; int n, m; void getnext(){ , j = ; nx[] = -; whil…
AC自动机 模板题 HDU-2222 Keywords Search #include<bits/stdc++.h> using namespace std; #define LL long long #define ULL unsigned LL #define fi first #define se second #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define max3(a,b,c) max(a,m…
[平衡树splay实现] 无注释代码 #include<bits/stdc++.h> using namespace std; typedef long long LL; ,MAXN=1e5+; int N; ],siz[MAXN],f[MAXN]; int root,sz; inline void clear(int x){ key[x]=cnt[x]=ch[x][]=ch[x][]=siz[x]=f[x]=; } inline int get(int x){ ]; } inline voi…
都是作者累积的,且看其珍惜,大家可以尽量可以保存一下,如果转载请写好出处https://www.cnblogs.com/pythonywy 一.md5加密 1.简介 这是一种使用非常广泛的加密方式,不可逆的,常见16位和32位一般都是md5 import hashlib data = '你好' print(hashlib.md5(data.encode(encoding="UTF-8")).hexdigest()) #32位 print(hashlib.md5(data.encode(…
题目链接 https://www.luogu.com.cn/problem/P6136 题目大意 需要写一种数据结构,来维护一些非负整数( \(int\) 范围内)的升序序列,其中需要提供以下操作: 插入一个整数 \(x\) . 删除一个整数 \(x\) (若有多个相同的数,只删除一个). 查询整数 \(x\) 的排名(排名定义为比当前数小的数的个数 \(+1\) ). 查询排名为 \(x\) 的数(如果不存在,则认为是排名小于 \(x\) 的最大数.保证 \(x\) 不会超过当前数据结构中数的…
1.POJ1258 水水的prim……不过poj上硬是没过,wikioi上的原题却过了 #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ,inf=1e8; ],g[maxn+][maxn+],ans=,n; ]; int main() { scanf("%d",&n); ;i<=n;++i) ;j<=n;++j) { scanf…
1. 旋转treap. 思想:一颗权值BST + 一颗 随机数 最小堆. BZOJ - 3224 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout); #define LL long long #define ULL un…
int Log[N]; struct ST { ], a[N]; void init(int n) { ]=-); i < N; i++) Log[i] = Log[i - ] + ((i & (i - )) == ); ; i <= n; ++i) dp[i][] = a[i]; ; j <= Log[n]; j++) ; i+(<<j)- <= n; i++) dp[i][j] = __gcd(dp[i][j-], dp[i+(<<(j-))][…
1. 单向边  + 新图建边 int belong[N], dfn[N], low[N], now_time, scc_cnt; stack<int> s; void dfs(int u){ dfn[u] = low[u] = ++now_time; s.push(u); for(int i = head[u]; ~i; i = nt[i]){ if(!dfn[to[i]]) dfs(to[i]); if(!belong[to[i]]) low[u] = min(low[u], low[to[…
struct FastIO { ; int wpos; char wbuf[S]; FastIO() : wpos() { } inline int xchar() { static char buf[S]; , pos = ; , len = fread(buf, , S, stdin); ; return buf[pos++]; } inline int xint() { , s = ; ) c = xchar(); , c = xchar(); + c - '; return x * s;…
题解: 替罪羊树的模板和splay差距还是比较大的.. 按照我的splay的写法 真是都是问题.. 替罪羊树就是暴力的搞 当某颗子树大小大于这棵树的alpha时 就退出 另外删除的时候打懒标记删除 当有用个数少于alpha*n的时候,就重构 注意点: 1.找rank的时候要找比它小的个数,不能像splay那样取min 2.删除的时候要删排名为这个的,不能删这个数 以上两点的原因是 不能保证相同元素一定在左子树内,因为重构可能造成在右子树 另外找pre和scc也就不能和splay一样了 rank(…
题面 DSU on tree确实很厉害,然后这变成了一道裸题(逃 还是稍微说一下流程吧,虽然我那个模板汇总里写过 DSU on tree可以以$O(n\log n)$的复杂度解决树上子树统计问题,它这样工作: 前置工作:对树进行轻重链剖分 1.递归求解所有的轻儿子,在回溯时消去影响 2.递归进入重儿子,在回溯时不消去影响 3.暴力统计子树信息 4.回答询问并回溯 根据轻重链剖分的性质,复杂度$O(n\log n)$ #include<cstdio> #include<vector>…
题目大意 你需要实现一种数据结构,支援以下操作. 给一个矩阵的子矩阵的所有元素同时加一个数. 计算子矩阵和. 题解 一看这个题,我就首先想到用线段树套线段树做. 使用二维线段树的错误解法 其实是第一次写二维线段树orz.为了方便,我们不再使用k<<1作为左儿子,k<<1|1作为右儿子,而是使用一个lc,rc数组来存储左孩子和右孩子.实现起来不是很麻烦但是有许多细节.我们可以在操作函数中写一个参数表示是操作的行还是操作的列.另外注意打标记.对于节点k,标记一旦下传,他的孩子的各种标记…
刚学vue的时候,曾经学习过slot插槽的使用,但是后面接触的不多,因为之前我还没使用element-ui... 但是使用了element-ui之后,里面的许多组件,有时候会使用插槽,为了巩固一下插槽,写一个笔记 首先,插槽有什么作用呢? 我们先来自定义一个组件: <template> <div> {{text}} </div> </template> <script> export default { data(){ return { text…
来自wjmzbmr的splay模板 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; + ; ; struct Node { Node*ch[], *p; int size, val, mx; int add; bool rev; Node() { size = ; val = mx = -INF; add = ; } bool d() { ]; } void set…
自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define N 80005 #define lc(x) ch[x][0] #define rc(x) ch[x][1] #define inf 0x3f3f3f3f using namespace std; ],size,ch[N*][],roo…
用晚自习学了一下splay模板,没想象中那么难,主要是左旋和右旋可以简化到一个函数里边,减少代码长度... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 33333 #define inf 0x3f3f3f3f #define lc(x) ch[(x)][0] #define rc(x) ch[(x)][1] using names…
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排名,查询区间某个值值前驱.后继.查询第k小值是log^3(n)的,其他都是log^2(n)的 #include <cstdio> using namespace std; ,inf=; ],root[],left,right,tot,son[maxn][]; int mmin(int x,int…
转啊转终于转出来了,然而我的模板跟陈竞潇学长的模板一模一样,还是太弱啊,第一次用指针. #include<cstdio> #include<cstring> #include<algorithm> #define for1(i,a,b) for(int i=(a);i<=(b);++i) using namespace std; typedef long long ll; ; int n,m,data[N]; struct node{ node(); node *…