作业链接
[蓝桥杯] 第五讲:数据结构与字符串 - 题单 - 洛谷 | 计算机科学教育新生态
AC 代码
P3367 【模板】并查集 - 洛谷
集合的合并与查询,无法从集合中删除元素。
fa[i] = j 表示 i 的祖先节点为 j,对于任意节点 x,若
fa[x] 相同则说明这些 x 属于同一个集合。
采用路径压缩写法的
find(),每次调用的复杂度可以认为是均摊的 \(O(1)\)
1 |
|
P8686 [蓝桥杯 2019 省 A] 修改数组 - 洛谷
题目中要求的将重复出现的数字不断 +1
直到未出现过,暴力做法的复杂度为 \(O(n)\),但使用并查集的思想:认为相同元素为一个集合,每次将需要修改的元素赋值为祖先节点即可,复杂度为
\(O(1)\)
1 |
|
P1168 中位数 - 洛谷
本题为堆的应用:对顶堆求中位数(第(n/2)小元素)
顾名思义,对顶堆中使用大小根堆构成对顶的结构
对于大根堆,可以视为一个上窄下宽的金字塔,塔尖是最大的元素 对于小根堆,可以视为一个下窄上宽的金字塔,塔尖是最小的元素 将小根堆叠在大根堆上,就形成了对顶堆(上大下小)
简单比较两个堆的堆顶可知:当小根堆的堆顶大于大根堆的堆顶时,小根堆的所有元素都大于大根堆的所有元素。因此只需要保证大根堆的大小为 k,并且大根堆的堆顶始终小于小根堆的堆顶,即可以通过大根堆的堆顶求出第 k 小的元素了。
在保持堆的性质时向堆中插入元素的复杂度为 \(O(logn)\),查询堆顶的复杂度 \(O(1)\),本题中需要插入 \(n\) 个数字,总的复杂度为 \(O(nlogn)\)。
1 |
|
P8755 [蓝桥杯 2021 省 AB2] 负载均衡 - 洛谷
首先可以想到为每台计算机用一个数组维护其得到的任务,然后根据时序模拟判断是否可以释放被占用的资源,但这样就需要 \(O(n)\) 的复杂度来寻找可以释放的资源。每个时刻都需要检查所有计算机,总的时间复杂度为 \(O(nm)\) 再观察题目发现,输入的数据是按时间单调变化的,因此我们可以改用堆来维护每台计算机分到的任务,每次只需要检查堆顶即可找到最可能结束的任务,复杂度降低为 \(O(mlogn)\)。
1 |
|
P3374 【模板】树状数组 1 - 洛谷
通过 lowbit 操作,可以在 \(log\) 的复杂度内得到区间和
1 |
|
P8613 [蓝桥杯 2014 省 B] 小朋友排队 - 洛谷
通过树状数组可以实现动态前缀和
1 |
|
归并排序做法
1 |
|
P3372 【模板】线段树 1 - 洛谷
线段树是一种节点中保存区间信息的树,可以做到 \(log\) 复杂度的区间操作
1 |
|
P3375 【模板】KMP - 洛谷
一种在线性时间复杂度内从指定字符串中判断特定字符串是否存在的方法
1 |
|
P3370 【模板】字符串哈希 - 洛谷
手写哈希函数
1 |
|
P8630 [蓝桥杯 2015 国 B] 密文搜索 - 洛谷
使用 unordered_map 这个 STL
的模板,可以便捷地实现对字符串的哈希
1 |
|