知识储备
文章平均质量分 95
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 · 1208 阅读 · 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 · 351 阅读 · 0 评论 -
树链剖分——重链剖分
1.树链剖分的用处对如下问题我们可以采用树链剖分的方法去做1.把某个节点的子树的每个节点都加上一个值z2.查询某个节点的子树的所有节点的值的和求出来3.把一个节点x到y之间最短路径(经过边的条数最少)上的每个节点都加上某个值z4.把一个节点x到y之间最短路径(经过边的条数最少)上的所有节点的和求出来由于我们需要解决这些问题,所以我们要使用树链剖分这种算法。2.实现原理:1.知识储备:重儿子:该节点的所有儿子中,子树中节点个数最多的儿子。举例:节点A有两个儿子,G所形成的树中有6个结点分原创 2020-11-30 22:17:00 · 323 阅读 · 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 · 143 阅读 · 0 评论 -
获取以2为底log值的两种方法
求log2xlog_2^xlog2x(向下取整)用处:ST表,求最近公共祖先代码;#include<bits/stdc++.h>using namespace std;#define N 100005int Log[N],lg[N];int main(){ int n=10000; //方法一: for(int i=1;i<=n;i++) { Log[i]=Log[i-1]+(1<<Log[i-1]==i)原创 2020-11-23 23:16:39 · 6753 阅读 · 0 评论 -
离散化问题复习题集(持续更新)
Painting the Fence S原创 2020-11-19 13:09:03 · 161 阅读 · 0 评论 -
拓扑排序模板
#include<iostream>#include<vector>#include<string.h>#include<queue>using namespace std;int n,m;int deg[100];//度 vector<int> G[100];void TPsort(){ queue<int> q; for(int i=1;i<=n;i++) if(!deg[i]) q.push(i);原创 2020-10-24 21:34:00 · 93 阅读 · 0 评论 -
最小生成树
MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,b},再从集合U-V中找到另一点c使得点c到V中任意一点的权值最小,此时将c点加入集合V,直至所有顶点全部被加入V,此时就构建出了一颗MST。因为有N个顶点,所以原创 2020-10-17 00:30:33 · 132 阅读 · 0 评论 -
求有向图的强连通分量-----tarjan算法
定义:有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。如何求:伪代码...原创 2020-10-21 20:06:56 · 338 阅读 · 0 评论 -
求无向图的连通分量
方法一【邻接矩阵DFS】邻接矩阵,DFS解#include<iostream>#include<cstdio>using namespace std;bool f[105][105],a[105]; //f邻接矩阵,a给走过的顶点做标记int m,n,ans;void ooo(int s){ a[s]=1; //标记 for(int i=1;i<=n;i++) { if(!a[i]&&f[s][i]) //当两点连通并且此点没有被访问原创 2020-10-21 19:59:21 · 6697 阅读 · 2 评论 -
并查集及种类并查集
B站并查集int find_root(int x){ if(parent[x]==-1)return x; while(parent[x]!=-1) { x=parent[x]; } return x;}int hebing(int x,int y){ int a=find_root(x); int b=find_root(y); if(a==b)return 1; else {if(deep[a]&原创 2020-10-20 12:38:18 · 184 阅读 · 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 · 105 阅读 · 0 评论 -
DFS剪枝
通过某种判断,避免一些不必要的遍历过程。在编写搜索程序的过程中都要考虑剪枝。剪枝优化的核心问题是设计剪枝的判断方法。5种深度优先搜索的优化技巧:1.优化搜索顺序搜索树中各个层次,各个分支之间的顺序不是固定的2.排除等效冗余在搜索的过程中,如果我们能判定某几条分支到达的子树是等效的,那么只需要对其中的一条分支进行搜索3.可行性剪枝在搜索的过程中对当前的状态进行检查,如发现无法到达递归边界,就执行回溯。4.最优性剪枝在最优化问题的搜素过程中,如果花费已经超过了当前的搜到的最优解,那么无论采原创 2020-09-27 18:21:50 · 255 阅读 · 0 评论 -
位运算
^ 相同为0,不同为1&都是1为1,否则为0| 都是0为0,否则为1原创 2020-08-13 15:02:13 · 107 阅读 · 0 评论 -
常用STL
栈stack是一种先进后出(FirstIn Last Out, FILO)的数据结构,它只有一个出口,只能操作最顶端元素。头文件: stack定义:stack<data_type> stack_name;如:stack s;操作:empty()-- 返回bool型,表示栈内是否为空 s.empty()size()-- 返回栈内元素个数 s.size()top()-...原创 2020-03-15 12:36:27 · 268 阅读 · 0 评论 -
8.4 算法学习---图论
图的储存结构1.二维数组邻接矩阵存储结构定义int G[N][N]G[i][j]的值,表示从i到j的边的权值注意:初始化数组大可不必使用两重循环1.int数组memset(G,0x7f,sizeof(G))初始化为一个很大的数,memset(G,0,sizeof(G))初始化为0。2.double数组memset(G,127,sizeof(G))初始化为一个很大的数,memset(G,0,sizeof(G))初始化为0。2.二维数组模拟邻接表储存结构#include<iostream&原创 2020-08-04 21:03:43 · 273 阅读 · 0 评论 -
二/三分总结
二分1.基本思想算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较,如果当前位置arr[k]值等于key,则查找成功;若key小于当前位置值arr[k],则在数列的前半段中查找,arr[low,mid-1];若key大于当前位置值arr[k],则在数列的后半段中继续查找arr[mid+1,...原创 2020-05-03 22:33:01 · 351 阅读 · 1 评论 -
7月29日
上午的时间,练习线段树模板各种模板的键入。因为我区间修改,区间查询,相关问题还不熟悉,也不能完全脱离模板因此下午的时候,在洛谷上练习了一个线段树的此类模板题。链接:https://www.luogu.com.cn/problem/P2023题目类型:区间修改(区间乘法和加法的组合),区间查询代码反复出错了很多地方,写代码加修改用了一下午的时间,为了更好地记住,在代码中标出出错点,以便日后反思代码:#include<bits/stdc++.h>using namespace std原创 2020-07-29 23:58:26 · 132 阅读 · 0 评论 -
7月27日树状数组
1.基础知识博客链接2.B站视频讲解3.最形象的树状数组示意图4.树状数组求逆序对及离散化的两种方式树状数组与离散化和求逆序对应该是经常组合起来用吧,今天一共做了俩题,一开始由于不懂离散化和求逆序对,对着别人的题解看了很长时间,勉强看懂,后来去搜了求逆序对和离散化之后,再看题时就很明朗了。5.洛谷1.P1168中位数想了半天,没有思路,最后看的别人的题解。如果要用树状数组的话,首先要离散化处理,不改变原数组的情况下,重新排列。离散化目的:找到每一个数在当前子串下对应的实际相对位置,为后原创 2020-07-28 00:21:22 · 97 阅读 · 0 评论 -
ICG博弈
博弈论基础知识巴什博奕威佐夫博弈尼姆博弈1尼姆博弈2原创 2020-07-22 22:06:39 · 151 阅读 · 0 评论