摘要: ARC205_B Triangle Toggle 问题陈述 有一个完整的图,图中有 \(n\) 个顶点,编号为 \(1\) 至 \(n\) 。每条边的颜色为黑色或白色。对于 \(i=1,2,\ldots,m\) ,连接顶点 \(U_i\) 和 \(V_i\) 的边被涂成黑色,其他所有的边都被涂成白色 阅读全文
posted @ 2025-09-08 21:13 liyuan2023 阅读(26) 评论(0) 推荐(0)
摘要: 2025.7.19 莫队 对于序列上的区间询问问题,如果从 \([l,r]\) 的答案能够扩展到 \([l-1,r],[l,r+1]\)(即与 \([l,r]\) 相邻的区间)的答案,那么可以在 \(O(n\sqrt n)\) 的复杂度内求出所有询问的答案。 实现 对询问区间进行排序,减少拓展次数。 阅读全文
posted @ 2025-07-20 18:27 liyuan2023 阅读(17) 评论(0) 推荐(0)
摘要: 2025.7.14 归并排序(merge_sort) 归并排序是高效的基于比较的稳定排序算法。 还可以求逆序对。 思想 对于两个有序的数组 \(a[n]\) 和 \(b[m]\) ,可以合并到一个数组 \(c[n+m]\) 中。 用双指针实现,每次往 \(c\) 数组中放入最大(最小)的元素。 时间 阅读全文
posted @ 2025-07-15 11:44 liyuan2023 阅读(29) 评论(0) 推荐(0)
摘要: 2025.7.10 线段树 基本思想 线段树是算法竞赛中常用的用来维护区间信息的数据结构。 线段树可以在 \(O(\log{n})\) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。 如上图所示,线段树的每一个根节点维护左右两个子节点的答案(区间和)。 阅读全文
posted @ 2025-07-11 21:58 liyuan2023 阅读(23) 评论(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 阅读(12) 评论(0) 推荐(0)
摘要: 2025.7.6 BFS 没啥好讲的,直接看例题。 例题P1379 题目描述 在 \(3×3\) 的棋盘上,摆有 \(8\) 个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格,空格用 \(0\) 来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局和目标布局(为了 阅读全文
posted @ 2025-07-09 17:42 liyuan2023 阅读(38) 评论(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 阅读(17) 评论(0) 推荐(0)
摘要: 2025.7.4 字典树(Trie) 例题 P4583 题目描述 你需要利用一台可移动的打印机打印出 $n$ 个单词。这种可移动式打印机是一种老式打印机,它需要你将一些小的金属块(每个包含一个字母)放到打印机上以组成单词。然后将这些小金属块压在一张纸上以打印出这个词。这种打印机允许你进行下列操作: 阅读全文
posted @ 2025-07-05 19:37 liyuan2023 阅读(6) 评论(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 阅读(7) 评论(0) 推荐(0)