Note - 一些东西

我们来进行一些学习:

数据结构:

队列

树的孩子兄弟表示法

并查集

树状数组

字典树trie

笛卡尔树

定义:

  • 树上每个节点都是一个二元组 (k,w)(k,w) ,只看 kk ,笛卡尔树是一棵二叉查找树;只看 ww ,笛卡尔树是一棵二叉小根堆。

性质:

  • 如果 kk 递增,笛卡尔树可以 O(n)O(n) 求得(单调栈维护右链)。

  • 如果 kk 互不相同, ww 互不相同,笛卡尔树唯一。

例题:

  • P5854 【模板】笛卡尔树 —— 模板。

  • P1377 [TJOI2011] 树的序 —— 键值满足二叉查找树性质,时间满足小根堆性质,故以 (k,time)(k,time) 建笛卡尔树就可以建成题目所要求的树。再观察发现,对于每一颗子树,根节点必须先于左右儿子,左儿子先于右儿子比右儿子先于左儿子更加划算,故输出树的先序遍历即可。

平衡树AVL

平衡树treap

哈希表

哈夫曼树

算法:

贪心

高精

埃氏筛和欧拉筛

排序

KMP

搜索剪枝

记忆化搜索

启发式搜索

双向BFS

迭代加深搜索

搜索对象的压缩储存

搜索练习题:

  • P1979 [NOIP2013 提高组] 华容道 —— 挺有意思的一道题,而且思维难度和码量都不算大,主要算法为 BFSBFS 和最短路。

  • 先观察题目可以发现,如果想让目标棋子移动,那么空白棋子必须在其相邻位置,所以我们拿到一个询问要干的第一件事情肯定是把空白棋子移动到目标棋子旁边,这个过程可以用 BFSBFSO(qnm)O(q\cdot n\cdot m) 的时间内解决。

  • 如果想让目标棋子向某一方向移动,需要让空白棋子移动到那一方向的相邻棋子。我们可以发现,棋子在棋盘上的状态只有 O(nm)O(n\cdot m) 种,相邻棋子只有四种,一个方向到另一个方向的种类最多有 1616 种,故可以预处理,对于每个状态进行 BFSBFS ,可以在 O(n2m2)O(n^2\cdot m^2) 的时间内解决。

  • 接下来只需要让目标棋子通过旋转和位移用最少步数走到目的地。但这个时候边权不再为定值,不可 BFSBFS 。不难发现只有 O(nm)O(n\cdot m) 条边,故对每一次询问都跑一次 DijkstraDijkstra 即可,可在 O(qnmlognm)O(q\cdot n\cdot m\cdot\log ^{n\cdot m}) 的时间内解决。

  • 总时间复杂度 O(nm(nm+qlognm))O(n\cdot m\cdot(n\cdot m + q\cdot\log^{n\cdot m}))

prim & kruskal 求最小生成树

求次小生成树

Dijkstra & bellman_ford & SPFA求单源最短路径

求单源次短路径

Floyd 求最短路和传递闭包

拓扑排序

求欧拉道路和欧拉回路

基环树上的算法

欧拉图上的算法

LCA

求强连通分量

缩点

割点,割边

树形dp

状压dp

优化dp

数学:

高中数学:代数 & 解析几何 & 立体几何

威尔逊定理

裴蜀定理

孙子定理(中国剩余定理

可重排列

可重组合

错排列,圆排列

鸽巢原理

二项式定理

容斥原理

卡特兰数

矩阵入门

特殊矩阵:稀疏矩阵,三角矩阵,对称矩阵

矩阵初等变换

矩阵加减乘和转置运算

线性方程组的高斯消元法

程序设计: