数据结构
文章平均质量分 92
s4ul
这个作者很懒,什么都没留下…
展开
-
treap详解
Treap详解Treap=Tree+HeapTreap中每个节点有2个值,其中一个满足二叉查找树的性质,一个满足大根堆的性质。把满足二叉查找树性质的值称作data,把满足大根堆性质的值称作value。 对于Treap来说,当前节点的data值大于左儿子,小于右儿子。当前节点的value值小于儿子节点的值。每个节点的data我们无法改变,为了保证Treap的平衡性,我们需要让每个节点的value均为随机值,这样我们就可以保证这棵树“基本平衡”。统计up:计算儿子数void up(int x){原创 2020-12-03 09:23:01 · 1207 阅读 · 0 评论 -
树链剖分——重链剖分
1.树链剖分的用处对如下问题我们可以采用树链剖分的方法去做1.把某个节点的子树的每个节点都加上一个值z2.查询某个节点的子树的所有节点的值的和求出来3.把一个节点x到y之间最短路径(经过边的条数最少)上的每个节点都加上某个值z4.把一个节点x到y之间最短路径(经过边的条数最少)上的所有节点的和求出来由于我们需要解决这些问题,所以我们要使用树链剖分这种算法。2.实现原理:1.知识储备:重儿子:该节点的所有儿子中,子树中节点个数最多的儿子。举例:节点A有两个儿子,G所形成的树中有6个结点分原创 2020-11-30 22:17:00 · 321 阅读 · 0 评论 -
差分:一维差分,二维差分,树上差分
一维差分差分概念对于一个数列 a_{i},我们需要维护的数据是“相邻两个数之差”。这种策略是,令pi=ai−ai−1p_i =a_i-a_{i-1}pi=ai−ai−1,即相邻两数的差。我们称数列pip_ipi为数列 a 的差分数列。它可以维护多次对序列的一个区间加上一个数,并在最后询问某一位的数或是多次询问某一位的数。譬如使 [l, r] 每个数加上一个 k,就是 pl=pl+k,pr+1=pr+1−kp_{l}=p_{l}+k, p_{r+1}=p_{r+1}-kpl=pl+k,pr+原创 2020-11-19 10:41:18 · 350 阅读 · 0 评论 -
树上倍增法求最近公共祖先模板
学习博客#include <bits/stdc++.h>using namespace std;int n,m,s,x,y,tot=0;const int N=100005;//N存储节点总数,M存储边的总数int deep[N],fa[N][22],lg[N];//deep[i]是i号节点的深度//lg是log数组struct node{ int u,v,next;}edge[4*N];int cnt;int head[N];void add(int u,i原创 2020-11-25 22:55:26 · 142 阅读 · 0 评论 -
线段树区间修改,区间查询模板题
A Simple Problem with Integers线段树区间修改,区间查询模板题#include <cstdio>#include <vector>#include <queue>#include <cstring>#include <cmath>#include <map>#include <set>#include <string>#include <iostream>原创 2020-10-21 20:08:43 · 262 阅读 · 0 评论 -
Mayor‘s posters
Mayor’s posters离散化,不然做不了,因为数据太大了#include <cstdio>#include <vector>#include <queue>#include <cstring>#include <cmath>#include <map>#include <set>#include <string>#include <iostream>#include &l原创 2020-10-18 22:54:14 · 70 阅读 · 0 评论 -
Sliding Window
Sliding Window我一开始用ST表做的,超内存,这是ST表的一个弊端吧?太耗内存ST表#include <cstdio>#include <vector>#include <queue>#include <cstring>#include <cmath>#include <map>#include <set>#include <string>#include <iostrea原创 2020-10-18 22:53:25 · 82 阅读 · 0 评论 -
DFS序
树状数组应用:区间求和。时间复杂度:处理O(logn),查找O(logn)拓展:二维树状数组。应用—矩阵求和。注意事项:树状数组的下标是1.……n的数组,因为lowbit(0)=0,会陷入死循环。lowbit(int x){ return x&(-x);}//单点增加void modify(int pos,int data){ for(int i=pos;i<=n;i+=low(x)) { a[i]+=data; }}//区间求和int s原创 2020-10-04 22:34:29 · 104 阅读 · 0 评论 -
ST算法
ST算法应用:多次求区间最大值时间复杂度:询问m次暴力: 总mn线段树:预处理O(logn),查找O(mlogn),总O(logn+m*logn)ST: 预处理O(logn),查找O(m), 总O(logn+m)预处理:const int logN=20;int log[n],f[n][logN+5];//预处理出1~n的log值,因为c++的log函数效率太低;预处理f[n][0]的值;log[0]=-1;for(int i=1;i<=n;i++){原创 2020-10-18 22:48:53 · 252 阅读 · 0 评论 -
树状数组
树状数组应用:区间求和。时间复杂度:处理O(logn),查找O(logn)拓展:二维树状数组。应用—矩阵求和。注意事项:树状数组的下标是1.……n的数组,因为lowbit(0)=0,会陷入死循环。lowbit(int x){ return x&(-x);}//单点增加void modify(int pos,int data){ for(int i=pos;i<=n;i+=low(x)) { a[i]+=data; }}//区间求和int s原创 2020-10-18 22:48:05 · 83 阅读 · 0 评论