- 博客(15)
- 收藏
- 关注
原创 2021-05-01
线段树 O(logN)的时间复杂度内实现单点修改,区间修改,区间查询(区间求和,区间最值)等。线段树维护的信息满足可加性。 建树 void build(int k,int x,int y){ l[k]=x; r[k]=y; if(l[k]==r[k]){ d[k]=a[l[k]]; return; } int mid=(l[k]+r[k])>>1; build(k<<1,x,mid); build(k<<1|1,mid+1,y); d[k]=d[k&l
2021-08-04 09:29:40 112
原创 数据结构基础(三)习题未处理
一、链表: 和数组都可以用于存储数据,其中链表通过指针来连接元素,而数组则是把所有元素按照次序存储。 数组和链表有不同的优势: 链表:可以方便地删除插入数据,操作次数为O(1),但寻找读取据的效率低,在随机访问数据中的操作次数为O(n)。 数组:可以方便地寻找读取数据,在随机访问中操作次数为O(1),但删除插入的操作次数为O() 二、哈希表 三、堆 四、分块 五、莫队 ...
2021-05-01 08:28:16 228
原创 数据结构基础(二)
一、并查集: 并查集是一种树形结构,处理一些互不相交的集合之间的合并及查询问题,支持查找和合并。 1.初始化: 每个节点单独属于一个集合。 void init(){ for(int i=1;i<=n;i++) fa[i]=i; return; } 2.查找: int find(int x){ if(fa[x]==x) return x; else return find(fa[x]);//树的结构固定,未做任何修改 } 路径压缩: 把每个点都直接连到祖先上去,因为只在意是否是同一个集合,即
2021-03-28 18:30:48 215
原创 数据结构基础(一)
一、栈: 栈是一种基本的线性数据结构,基于push和pop两种操作。先入后出,后入先出。 二、队列: 队列是一种基本的线性数据结构,满足先入先出的性质。 手写队列初始化: tail=0,head=1; 判断队列是否为空: if(head<=tail) //队列不为空 else //队列为空 三、双端队列: 可以在队首/队尾进行插入/删除操作。 代码实现: 1、数组模拟 2、deque 四、循环队列: 数组模拟队列时,队列尾指针向后移动,可能会到达数组末尾导致溢出,此时数组前端还有空闲,可以循环利用
2021-03-21 21:11:25 178
原创 图论中的连通性问题
无向图连通性问题: 有向图连通性问题: 并查集: 一种树型数据结构,处理一些不相交集合的合并及查询问题。通常在使用中以森林来表示。 因为我们不关心树的具体结构,所以不需要记录节点的儿子,只要记录节点的父亲即可。 初始时,每个节点自己就是树根。在合并两个集合时,找到这两个集合的根,把其中一个根的父亲设为另一个集合的根。 int find(int x){ if(!fa[x]) return x; return find(fa[x]); } void merge(int x,int y){ int rtx=
2021-02-24 11:03:19 460
原创 字符串相关算法
一、概念: (1)最长前后缀公共子串: 字符串的一个前缀和一个后缀,如果它们相同,就被称为一个前后缀公共子串。特别地,我们定义最长前后缀公共子串不能是字符串本身。 eg:abcdabc->abc aaaaaaa->aaaaaa (2)字符串匹配: 模式匹配:子串的定位操作通常称为串的模式匹配。 目标串:主串S 模式串:子串P 匹配成功:若存在P的每个字符依次和S中的一个连续字符序列相等,则称匹配成功。返回P中第一个字符在S中的位置。 匹配不成功:返回-1。 二、字符串匹配: 1、朴素的字符串匹配
2021-02-24 10:40:04 323
原创 数学
一、高精度: 高精度运算的输入和存储: 1.采用字符串形式输入,并将其转化为整数数组。 2.用一个整型变量记录数据的实际长度。 读入: const int maxlen=xxx; typedef int hp[maxlen]; void read(char s[],hp &a){ memset(a,0,sizeof(a)); int len=strlen(s); a[0]=len; for(int i=0;i<len;i++) a[len-i]=s[i]-'0'; } 高精度加法:
2021-02-24 10:04:16 96
原创 树状数组&线段树
一、差分&前缀和 1.差分: [l,r]整体加k,其实a[l]比前一个多了k,a[r+1]比前一个少了k,即d[l]+=k; d[r+1]-=k。 【例】区间加法: 给定一个序列a。有很多次操作,每次操作形如:A l r k,即将a[l…r]中的每个值都加上k。 输出执行完所有操作后的序列。 Length(a)<=10000000 Times of operation <=10000000 2.前缀和 令s[i]=∑a[j] (j=1…i) S称为a的前缀和 对于序列来说,前缀和和差分互
2021-02-23 19:04:56 275
原创 排序
算法性能分析: 是否稳定,空间复杂度,时间复杂度 三种O(n2) 的简单排序 插入排序 冒泡排序 选择排序 优点:简单,易于实现 缺点:复杂性高,不适合大规模数据 插入排序: //插入排序 void insert_sort(int n){ for(int i=1;i<n;i++) for(int j=i;j>0;j--){ if(a[j]<a[j-1]) swap(a[j],a[j-1]); else break; } } //稳定,空间复杂度O(1),时间复杂度平均O(n^
2021-02-22 11:17:12 81
原创 二分&三分
一、二分查找 有N个已经从小到大排好序的整数,查找是否存在某个数X? (洛谷 P2249) 首先比较序列中点A[mid],如果A[mid]等于X,则查找成功;如果A[mid]比X大,则只可能在序列的左半区间继续查找;如果A[mid]比X小,则只可能在序列的右半区间继续查找。 如此分而治之下去,查找的区间每次会折半,可以非常迅速地缩减区间长度。如果区间长度为1时都查找不到X,则最终区间左、右端点会反绕,表示查找失败。 #include<cstdio> #include<iostream>
2021-02-22 09:11:28 253
原创 动态规划(三)
一、DAG上的DP 当题目给定了一张有向无环图(DAG),或原问题可以抽象成一个DAG时,可以在DAG上进行DP来求解问题 DAG最短路 给定一个城市的地图,所有的道路都是单行道,而且不会构成环。每条道路都有过路费,问您从S点到T点花费的最少费用。 f(x)表示从S出发到达x的最少费用 f(x)=min(f(y)+w(y, x)) 实现时如何确定转移顺序? 拓扑排序/记忆化搜索均可 【例题】旅行计划 (洛谷 P1137) #include<cstdio> #include<iostream
2021-02-21 21:46:31 168
原创 动态规划二(上课)
一、树形DP: 在树结构上所做的动态规划,基础是树具有严格的层数关系。 一般来说树形DP是处理子树的信息以及相互关系来进行转移,其状态一般会表示为以i为根的子树的DP值。 1.求最大联通子树 一棵n个点的树,每个点i有点权ai,求一棵联通子树使点权和最大 n<=10 ^ 5 |ai| <= 10^9 f[u]=a[u]+∑max(f[v],0) 答案为max(f[i]), i=1…n 【例题】洛谷 P1122 #include<cstdio> #include<iostream
2021-02-21 19:24:34 125
原创 贪心&树图基础&最小生成树
贪心算法: 总是做出当前看来最好的选择,某种意义上的局部最优解。 核心是去寻找一种解决问题的方法,如果策略正确,那么往往是易于描述、易于实现的。 一、最优装载问题 给出n个物体,第i个物体重量为wi。选择尽量多物体,使总重量不超过C。 只关心数量,装重的没有装轻的划算。 二、部分背包问题 有n个物体,第i个物体的重量为wi,价值为vi,选若干个物体,使在总重量不超过c的情况下总价值最大。这里的每个物体都可以只取走一部分,价值和重量按比例计算。 综合考虑重量和价值两个因素,计算出每一种物体单位重量的价值,然后
2021-02-21 16:21:30 348
原创 动态规划一(上课)
1.状态怎样定义 2.怎样进行状态的转移 核心思想:讲一个问题拆成若干子问题,通过求解子问题,来推断原问题的解。 性质: 1.无后效性,”未来与过去无关“,如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响。 2.最优子结构,大问题的最优解可以由小问题的最优解推出。 解题条件:能将大问题拆成几个小问题,且满足无后效性,最优子结构性质。 【例1】: 假设你有足够的1、5、11元面值的钞票。现在你的目标是凑出某个金额w,求需要用到尽量少的钞票数。 解: #include<cst
2021-02-20 14:52:08 213
原创 基础搜索(上课)
1.DFS: 递归,构建搜索树。 【例1】全排列问题: #include<cstdio> #include<iostream> using namespace std; int n; bool vis[1005]; int a[1005]; void print(){ for(int i=1;i<=n;i++) printf("%d ",a[i]); printf("\n"); } void DFS(int x){ if(x==n+1){ print(); ret
2021-01-10 17:26:58 201 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人