更新到:Educational Codeforces Round 10 题解
树上问题
与某一点的子树有关的,思考树形 dp,dsu on tree
如果是某个点与所有点有关,对所有点求答案,就考虑换根 dp。能换根的前提是 dp 方程可以轻松地修改(取 / 不取某一个子树)(1 2)
与某两个点有关的,考虑取 LCA,或者路径上一些特殊点(比如路径中点,树的重心)(1)
树上前缀和、树上差分?(1)
图论如果涉及到环或者强连通分量,考虑 tarjan 缩点;或者如果一堆特征相似的东西可以合并考虑,也考虑缩点思想(1 2 3)
必经点:割点;必经边:割边(1)
特征点最短路,图中有多个特殊的点,到达某点可以获得加成(1)
图论模型!!!
一切涉及到状态转换的题目,要求满足传递性
执行操作?如果操作的几个参数具有传递性,执行一种操作等价于执行另一连串操作(类似于两个点之间有多条路径)(1)
满足传递性的点在一个联通块内(2)
一次操作是从一个状态转移到另一个状态(3)
括号序列转换为 +1 和 -1 或者是 1 和 0,差分思想(1转化为+1-1的折线图思想,虽然不是括号序列 2维护左括号减右括号的数量 3维护左括号减右括号的数量)
括号序列也可以区间 DP 做
事件思想,一条线段的左端点看成 +1 事件,右端点看成 -1 事件(1)
无法直接计算的题目转化为算贡献,使用数组或者哈希表记录可能产生贡献的元素(1 2 3 4 这个实在太多了以后就不整理了)
前缀和式子导出的区间相等 (a_{r_1} - a_{l_1 - 1} = a_{r_2} - a_{l_2 - 1}) 往往有奇妙的性质,尝试移项?(1)
动态研究添删一个物品,考虑添删这个物品的过程和影响(1)
拓展:从一个合法状态“扩张”到另一个合法状态(2)
拓展:单调栈、单调队列解决问题(3)
类似于树状数组求逆序对的思想,边插入边求值(1 2 3 4)
逐位运算,求最值(类似异或),从高位往低位贪心(1)
Mex 可以用权值数据结构二分做(1)
题目可以转化成 DAG 上跑 DP(1 2)
缩点后 DAG 上跑 DP(3)
DP 消掉后效性:最短路转移(SPFA Dij),排序(1虽然这个不是DP,但是利用了排序消除后效性的思想 2排序消除背包物品的后效性)
DP 的值可以加入当前状态,也可以不加(1)
如果题目有两个自相矛盾的限制,其中一个要优先满足,考虑两次 DP(无后效性的特点)(1)
先用一个 DP 预处理,再用一个 DP 求答案,也是两次 DP(1)
构造方案题!!!
考虑 DP 转移:设 bool f[][][]
表示当前状态是否有解(如果要求最优则定义最优子结构),g[][][]
表示当前状态从哪里转移过来的(1 2但是这个并不需要输出方案 3bitset优化背包)
涉及到整除 2 的((lfloorfrac{n}{2} floor)),路径中点可能不存在的,考虑按奇偶性分类讨论(1)
补集转换!!!
子树外有 (k) 个转换成子树内有 (tot - k) 个(1)
一维序列上对连续一段操作用差分转换为单点问题(1)
小于某个数设成 0,大于某个数设成 1(1《HEOI/TJOI排序》 2中位数金字塔,经典题了 3)
二维平面中维护特殊线段(垂直 x 轴,垂直 y 轴,对角线)的区间和:树状数组(1 2)
遇事不要慌,先想想是不是假题
暴力构造的复杂度?(1)
会做 (k) 但不会做 (k + 1)?有一维不会处理?枚举它!(1 2 3 4)
高端算法不会做,先想想好做的(5)
两维的独立问题? 放到平面坐标系上试试!(1)
修改一个数,求最长区间?双指针维护往左往右(1)
预处理出往左走、往右走最远的符合条件的位置(2 2)
支持离线,查询区间,可以快速添删区间左右端点的元素:莫队(1 2 3)
支持快速添删一个元素,查询最值,查询相邻元素,使用 std::set
和 std::multiset
(1 2 3)
连续跳有点慢?考虑倍增(1)