摘要: 2025.7.14 归并排序(merge_sort) 归并排序是高效的基于比较的稳定排序算法。 还可以求逆序对。 思想 对于两个有序的数组 \(a[n]\) 和 \(b[m]\) ,可以合并到一个数组 \(c[n+m]\) 中。 用双指针实现,每次往 \(c\) 数组中放入最大(最小)的元素。 时间 阅读全文
posted @ 2025-07-15 11:44 liyuan2023 阅读(0) 评论(0) 推荐(0)
摘要: 2025.7.10 线段树 基本思想 线段树是算法竞赛中常用的用来维护区间信息的数据结构。 线段树可以在 \(O(\log{n})\) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。 如上图所示,线段树的每一个根节点维护左右两个子节点的答案(区间和)。 阅读全文
posted @ 2025-07-11 21:58 liyuan2023 阅读(3) 评论(0) 推荐(0)
摘要: 2025.7.8 分块 基本思想 通过对原数据的适当划分,并在划分后的每一个块上预处理部分信息,从而较一般的暴力算法取得更优的时间复杂度。 一般以 \(\sqrt{n}\) 为一个区间。 实现:以区间和为例 构造 void add(int p,int x){ id[p]=(p-1)/d+1;//d: 阅读全文
posted @ 2025-07-09 20:47 liyuan2023 阅读(3) 评论(0) 推荐(0)
摘要: 2025.7.6 BFS 没啥好讲的,直接看例题。 例题P1379 题目描述 在 \(3×3\) 的棋盘上,摆有 \(8\) 个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格,空格用 \(0\) 来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局和目标布局(为了 阅读全文
posted @ 2025-07-09 17:42 liyuan2023 阅读(4) 评论(0) 推荐(0)
摘要: 前缀和 常用于区间求和,对于长度为 \(n\) 的连续区间求和,时间复杂度从 \(O(n)\) 降到 \(O(1)\) 。 实现 构造 for(int i=1;i<=n;i++){ f[i]=f[i-1]+a[i]; } 查询 \(\sum_{i=l}^{r}a_i=f_r-f_{l-1}\) 即 阅读全文
posted @ 2025-07-06 10:45 liyuan2023 阅读(6) 评论(0) 推荐(0)
摘要: 2025.7.4 字典树(Trie) 例题 P4583 题目描述 你需要利用一台可移动的打印机打印出 $n$ 个单词。这种可移动式打印机是一种老式打印机,它需要你将一些小的金属块(每个包含一个字母)放到打印机上以组成单词。然后将这些小金属块压在一张纸上以打印出这个词。这种打印机允许你进行下列操作: 阅读全文
posted @ 2025-07-05 19:37 liyuan2023 阅读(4) 评论(0) 推荐(0)
摘要: 2025.7.3 字典树(Trie) 为啥做这个题单?而且没做完 字典树的应用 查找已出现过的字符串 实现 构造 void add(string s){ int p=0,ch; for(int i=0;i<s.size();i++){ ch=s[i]-'a'; if(!tr[p].mp[ch]){ 阅读全文
posted @ 2025-07-05 19:32 liyuan2023 阅读(1) 评论(0) 推荐(0)