时间久了记不清哪些刷过,哪些未刷过。遂用复选框改造,做题后留痕。
对于 双变量问题,例如两数之和 ai+aj=ta_i+a_j=tai+aj=t,可以枚举右边的 aja_jaj,转换成 单变量问题,也就是在 aja_jaj 左边查找是否有 ai=t−aja_i = t-a_jai=t−aj,这可以用哈希表维护。
我把这个技巧叫做 枚举右,维护左。
对于三个或者四个变量的问题,枚举中间的变量往往更好算。
通常要用到「枚举右,维护左」的技巧。
二维前缀最小值:
原理讲解(推荐和【图解】从一维差分到二维差分 一起看)
注:部分题目可以不用栈,而是用一个数字记录嵌套深度。
见 单调栈题单。
队列常用在 BFS 中,见 网格图题单 和 图论题单。与此相比,栈常用在 DFS 中,但无需我们手动维护。
个人觉得叫单调双端队列更准确。
一般用来维护一段转移来源的最值。
部分题目也可以用二分解决。
基于堆的反悔贪心。
也可以用有序集合。
另见 图论题单 中的 Dijkstra 算法。
部分题目也可以用试填法解决。
见 网格图题单 中的 DFS 和 图论题单 中的 DFS,其中大部分题目也可以用并查集实现。
也叫 GCD 并查集。
能用树状数组解决的题目,也能用线段树解决(反过来不一定)。但树状数组实现简单,代码短。
为方便大家练习,我把适合用树状数组解决的题目分到树状数组中,其余分到线段树中。
除了可以用树状数组解决,部分题目也可以在归并排序的同时计算。
部分题目也可以用珂朵莉树解决。
对询问排序,通过改变回答询问的顺序,使问题更容易处理。
相应的,在线算法就是按照 queries\textit{queries}queries 的顺序一个一个处理。
欢迎关注 B站@灵茶山艾府
如果你发现有题目可以补充进来,欢迎评论反馈。