
算法竞赛进阶指南
文章平均质量分 68
静妮子i
这个作者很懒,什么都没留下…
展开
-
0x21树与图的遍历
表示方法:给定N个点的树或图,其节点编号为1-N,无向图中的边看作成对出现的双向边,树看作一张具有n-1条边的无向图,他们的边都存储在一个邻接表中,邻接表以head数组为表头,使用ver数组存储边的终点,edge数组存储边的权值,使用next数组模拟链表指针。//加入有向边(x,y)权值为zvoid add(int x,int y,int z){ ver[++tot]=y;edge[tot]=z; next[tot]=head[x];head[x]=tot;//在表头处插入}//访问从x出发原创 2021-08-15 17:48:52 · 180 阅读 · 0 评论 -
0x41并查集
并查集:一种可以动态维护若干个不重叠的集合,并支持合并与查询的数据结构。1.get :查询元素属于哪一个集合2.merge:合并两集合使用“代表元法”表示并查集:选择固定元素代表集合使用树形结构存储每个集合,树上每一个节点都是一个元素,树根是集合的代表元素。整个并查集是一个森林,通过维护数组fa[n]记录整个森林,fa[x]保存x 的父节点,特别的,树根的fa[x]值等于自身。合并操作:将其中一个树根直接连接到另一棵树上,即fa[root1]=root2查询归属:递归访问父节点直到树根。路原创 2021-08-11 21:54:16 · 272 阅读 · 0 评论 -
0x17二叉堆
一颗满足堆性质的完全二叉树大根堆:树中任意一个节点的权值都小于等于其父节点的权值小根堆:树中任意一个节点的权值都大于等于其父节点的权值堆的实现及常见操作(小根堆):插入:向二叉堆中插入一个带有权值val的新节点先将该节点插入二叉堆尾部,然后通过交换的方式向上调整,直至满足堆性质,O(logN)获得集合最小值:返回堆顶权值删除最小值:将堆顶元素移除,与尾部元素交换,移除尾部元素,堆顶向下调整修改任意元素:找到修改元素,修改后向上向下调整删除任意元素:与尾部元素进行交换,并调整// heap原创 2021-08-10 22:27:52 · 129 阅读 · 0 评论 -
0x16Trie
Trie(字典树)是一种用于实现字符串快速检索的多叉树结构。每个节点都拥有若干字符指针,若在插入或检索字符串时扫描到一个字符c,就沿着当前节点的c字符指针,走向下一个节点,直至遇到标志字符串结束。基本操作初始化:创建根节点,该点字符指针指向空。插入:初始化一个指向根节点的指针p,依次扫描字符串S的各个字符c若p节点的c字符指针指向某节点Q,令p=Q若p节点的c字符指针指向空,创建一个新节点Q,令p的c字符指针指向Q,p=Q当字符串S扫描完毕,在当前p节点上标记其为一个字符串的末尾检索初始原创 2021-08-08 16:02:27 · 89 阅读 · 0 评论 -
0x14 Hash
Hash表:一般由Hash函数(散列函数)与链表结构共同实现。与离散化思想类似:将复杂信息映射到一个较容易维护的值域内但可能存在两个不同信息映射为同一值,即产生冲突一种解决方案:建立一个邻接表结构,以Hash函数的值域作为表头数组Head,映射后值相同的信息构成一个链表接在对应表头。(可以链表中进行信息比较)137. 雪花雪花雪花书上的代码#include <bits/stdc++.h>#define ll long longusing namespace std;const原创 2021-08-05 18:15:46 · 128 阅读 · 0 评论 -
0x13链表与邻接表
单链表的实现struct node{ int value; node *pre,*next;}; node *head,*tail;void init(){ head=new node(); tail=new node(); head->next=tail; tail->pre=head; }void insert(node *p,int val)//在p后插入包含数据val的新节点 { q=new node(); q->value=val; p->原创 2021-08-04 17:14:01 · 167 阅读 · 0 评论 -
第一章练习
116. 飞行员兄弟#include<bits/stdc++.h>using namespace std;char s[5][5],tem[5][5];int stepx[20],stepy[20],temx[20],temy[20],m[5][5];int res=1e9,ans=0,minn=1e9;void change(int x,int y){ m[x][y]=!m[x][y]; for(int i=0;i<4;i++) { m[i][y]=!m[i][y原创 2021-08-03 17:19:02 · 124 阅读 · 0 评论 -
0x11栈
后进先出栈顶可进出元素,栈顶不可可用数组和一个记录栈顶位置的变量实现栈结构例题:#include<bits/stdc++.h>using namespace std;int f[1000005],sum[1000005],s1[1000005],s2[1000005];int main(){ int t; f[0]=-0x3f3f3f3f; while(~scanf("%d",&t)) { int t1=0,t2=0; while(t--) { char原创 2021-07-28 16:38:33 · 202 阅读 · 0 评论 -
0x05排序
排序算法分为三类:选择排序(不稳定),插入排序,冒泡排序堆排序(不稳定),归并排序,快速排序(不稳定)计数排序,基数排序,桶排序前两类是基于比较的排序算法第一类O(n2);第二类O(nlogn)第三类不直接比较大小,对被排序数值采取按位划分或分类映射等处理方式,因此时间复杂度与数值大小范围也有关。各类算法分析具体参考https://blog.youkuaiyun.com/alzzw/article/details/98100378...原创 2021-07-27 18:56:39 · 190 阅读 · 0 评论 -
0x03 前缀和与差分
前缀和对于一个给定数列A前缀和数列 S[i]=∑j=1i\sum_{j=1}^{i}∑j=1iA[j]部分和即某区间内数的和可表示为前缀和相减的形式sum(l,r)=∑i=lr\sum_{i=l}^{r}∑i=lrA[i]=S[r]-S[l-1]二维数组:前缀和数列 S[i][j]=∑x=1i\sum_{x=1}^{i}∑x=1i∑y=1j\sum_{y=1}^{j}∑y=1jA[x][y]S[i][j]=S[i-1][j]+S[i][j-1]-S[i-1][j-1]+A[i]原创 2021-07-08 20:29:35 · 165 阅读 · 0 评论 -
0x02递推与递归
一个实际问题的各种可能情况构成的集合通常称为状态空间程序的运行是对于状态空间的遍历递推和递归是程序遍历状态空间的两种基本方式宏观描述递推:以已知问题边界为起点向原问题正向推导的拓展方式递归:以原问题为起点尝试寻找把状态空间缩小到已知的问题边界的路线,再通过该路线反向回溯的遍历方式递归算法程序执行操作:1.缩小问题状态空间的规模2.尝试求解规模缩小以后的问题(自身调用自身)3.如果成功,即找到了规模缩小后的问题的答案,那么将答案扩展到当前问题。如果失败,重新回到当前问题(回溯时还原现场),寻原创 2021-07-08 12:07:34 · 201 阅读 · 0 评论 -
0x01位运算
与:and ,&或:or , |非:not ,~异或:xor , ^m位2进制数:从右往左依次为0~m-1位补码移位运算左移:1<<n = 2n ; n<<1 = 2n(低位以0填充,高位越界舍弃)算术右移:n>>1 = (n/2.0)向下取整PS:与除法区别,整数除法是向0取整(在二进制补码表示下把数字同时向右移动,高位以符号位填充,低位越界舍弃)逻辑右移:高位以0填充,低位越界舍弃一般编译器默认算术右移应用:快速幂:i原创 2021-07-07 13:46:36 · 2049 阅读 · 0 评论