数据结构
文章平均质量分 59
数据结构
陌上花开 ~
越努力,越幸运(研究生在读)
展开
-
2022牛客寒假算法基础集训营2,小沙的数数(分块,逆元)
传送门思路:首先对题意要有深刻理解,由于运算是有优先级的,且我们发现每一个+会区分开一段区间,每个区间的值互不干扰,所以我们可以提前将每一个区间的信息整合到一个值里面,然后进行计算,也就是分块的思想(块内乘积,块间加减),首先预处理第一块:第1个数字在第1块里,第一块的值是a[1],最后修改的过程中,定位到所要修改块的位置pos,之后改变块内的值,然后重新计算新值即可代码:#include<iostream>#define int long longusing namespace原创 2022-01-29 11:15:00 · 553 阅读 · 0 评论 -
L2-022 重排链表 (22->25分,前向星)
传送门22分代码:#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define f(i,a,n) for(int i=a;i<n;++i)#define ff(i,a,n) for(int i=a;i<=n;++i)const int INF=0x3f3f3f3f;using namespace std;typedef long long原创 2022-04-14 22:09:33 · 2949 阅读 · 0 评论 -
L3-028 森森旅游 (multiset维护,dijkstra30分与spfa28分)
L3-028 森森旅游 (30 分)dijkstra的ac代码:#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define f(i,a,n) for(int i=a;i<n;++i)#define ff(i,a,n) for(int i=a;i<=n;++i)using namespace std;typedef long long ll;原创 2022-03-27 20:43:31 · 726 阅读 · 0 评论 -
L2-012 关于堆的判断 (模拟小根堆)
目录堆定义合并果子L2-012 关于堆的判断堆定义堆(Heap)是计算机科学中一类特殊的数据结构的统称,通常是一个可以被看做一棵完全二叉树的数组对象堆满足下列性质:堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树合并果子首先通过一道题回顾一下堆的基本操作在合并果子(传送门)中,我们可以增加限制条件,把可以合并2堆果子改为:可以将不超过K堆果子合并到一起,那么可以贪心地想到,我们第一次合并的次数不一定是K,但后面每一次合并的次数一定是K代码:#include <原创 2022-02-06 13:45:27 · 1132 阅读 · 1 评论 -
2022牛客寒假算法基础集训营2,小沙的魔法(并查集,离散化)
传送门思路:区间从0增加到目标值,等价于初始就是区间目标值情况下,每次使得区间-1,最后使目标值全部变成0,那么整体思路就是先把高的点降下去,然后等到这个边连接的两个点高度相同的时候,把他们连接起来,所以我们可以找到每边的两个点高度较低的那个作为这个边的权值(高度降到较低的那个时,才是两点相连的时候),将边权从大到小排序,从大到小遍历,在遍历过程中寻找所在连通块,进行合并(抽象成一个点,让他们高度相同),由于权值过大,所以离散化一下即可代码:#include <bits/stdc++.h&g原创 2022-01-29 12:15:00 · 128 阅读 · 0 评论 -
L2-026 小字辈(24到25分,bfs)
传送门24分bfs代码:#include <bits/stdc++.h>#define f(i,a,b) for(int i=a;i<b;i++)#define ff(i,a,b) for(int i=a;i<=b;i++)#define debug(x) cout<<#x<<" : "<<x<<endl;using namespace std;const int N=1e5+5;int ne[N],e[N],h[N]原创 2022-01-23 19:10:46 · 414 阅读 · 0 评论 -
Merging Linked Lists(前向星建立链表)
传送门思路:前向星建图,之后从起始节点顺序遍历,并依次将信息存入数组中,之后按照题目要求顺序重排链表即可,注意前向星遍历过程中是i=h[e[i]],来实现链表形式的访问,其优点在于当节点地址大小远大于节点个数时,可以节省空间注意:对最后一个节点-1的处理前向星代码:#include <bits/stdc++.h>#define f(i,a,b) for(int i=a;i<b;i++)#define ff(i,a,b) for(int i=a;i<=b;i++)#d原创 2022-01-22 18:51:11 · 688 阅读 · 0 评论 -
这是“数“论题(树状数组+离散化)
这是"数"论题思路:数据很大,但是只查询大小关系,离散化处理后用树状数组计数即可,对于一次查询 ,当我们dfs这个点时,因为因为是从树根往下去搜索,之前的节点一定不在这个节点的子树里,所以要先减去父节点对查询的影响,再加上查询的结果代码:#include <bits/stdc++.h>#define ll long long#define ull unsigned long long#define chushi(a, b) memset(a, b, sizeof(a))cons原创 2021-08-23 11:40:47 · 119 阅读 · 0 评论 -
Treap(平衡树)入门
首先,我们需要依次了解二叉搜索树和Treap的概念:二叉搜索树简介Treap然后,给一道板子题:普通平衡树PS.Treap,Splay,01trie,红黑树,替罪羊树等都可以,然而我只学了Treap????代码:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 1000原创 2021-07-21 22:46:01 · 1770 阅读 · 1 评论 -
最短路(天梯赛练习)
目录EmergencyTravel PlanGas StationAll Roads Lead to RomePublic Bike ManagementEmergency1003 Emergency (25 分)思路:Dijkstra+更新各种信息代码:#include<bits/stdc++.h>#define LL long long#define f(i,a,b) for(int i=a;i<b;i++)#define js ios::sync_with_stdi原创 2021-03-08 20:19:15 · 156 阅读 · 0 评论 -
图的遍历(PAT : A1013,A1021,A1034,A1076,Interstellar Love)
目录Battle Over CitiesDeepest RootHead of a GangForwards on WeiboBattle Over Cities1013 Battle Over Cities (25 分)思路:dfs或并查集判连通就好代码1(邻接矩阵+dfs):#include <cstdio>#include <algorithm>using namespace std;int v[1010][1010];bool vis[1010];int原创 2021-03-07 21:31:29 · 130 阅读 · 0 评论 -
二叉树遍历(数组和结构体建图,实现翻转等操作)
例一:1020 Tree Traversals (25分)思路:因为后序:左子树->右子树->根,中序:左子树->根->右子树,所以用后序的根确定这棵树的左右子树,再通过左子树的大小(节点个数)找到左子树的根,递归建树,之后bfs收尾...原创 2020-05-24 19:20:22 · 306 阅读 · 0 评论 -
二叉搜索树结构定义及建立
题意不赘述:L2-004 这是二叉搜索树吗? (25分)知识点:基本二叉树的构造+遍历(先序,后序),二叉搜索树(BST)构造,vector操作,指针与引用规律:用BST的先序(ar1)构造出来的BST的先序(ar2)满足ar1==ar2思路:直接用给定的整数键值序列来构造BST,之后求BST和其镜像的先序和后序,其中递归求镜像的时候将leftchild和rightchild互换位置注......原创 2020-03-29 14:01:17 · 1560 阅读 · 0 评论 -
并查集(CF - 1263D)
D. Secret Passwords思路:暴力合并,依次遍历每个字母,如果能找到的话,首先找到一个含这个字母的子树k,之后找到所有也含这个字母的字符串,将他们所在的树合并到树k上,这样就可以保证所有同类的密码都在同一棵树上,之后遍历每个字符串,如果发先有不同的树,答案就+1最终输出答案就可以了代码:#include<iostream>#include<string>using namespace std;string str[200010];int fa[20原创 2021-02-09 23:13:03 · 158 阅读 · 0 评论 -
KMP+Trie+AC自动机总结(字符串)
KMP简介:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)O(m+n)O(m+n)图片:next数组求法:void getNext(){ int len=n;原创 2020-07-13 15:14:46 · 623 阅读 · 1 评论 -
线段树初步(单点修改,区间查询)
线段树介绍:线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。原创 2020-06-18 14:43:18 · 363 阅读 · 0 评论