做题情况
P9941: 偶数多则用偶数和奇数相加变奇数,奇数多则奇数加奇数变偶数,贪心。
P11226: 使用 Trie 树根据字母大小关系建有向边,不是 DAG 输出无解,否则跑一遍拓扑排序。
P3369: 平衡树模板,我用的 FHQ Treap。
P3391: 文艺平衡树模板,我用的 FHQ Treap。
P2161: set 按区间右端点排序,A 操作直接用 set 找,B 操作为 set 元素个数。
P3835: 我用的 FHQ Treap,在普通模板上加一个 root 数组记录每个历史版本的根。
P1922: 简单树形 DP。
P1489: \(dp_{i, j}\) 表示 \(i\) 个人 \(j\) 血是否可行,直接背包,然后选出最好的血量。
P7764: 直接莫队。
P9825: 偶数个数 \(x = \frac{n}{3}\),奇数乘偶数贡献 \(x\times (n - x)\),偶数乘偶数贡献 \(\frac{x \times (x - 1)}{2}\)。
P3398: \(dist(a, b) + dist(c, d) \ge dist(a, c) + dist(b, d)\) 则两条路径相交。
P1362: 由于进位会对数位和产生影响,所以判断所有可能不产生进位的数即可。
P1475: 直接 DFS。
P1467: 直接往后判断是否是循环数即可。
P2401: \(dp_{i, j}\) 表示 \(i\) 个数 \(j\) 个小于号的方案数,分成插入到最左边,插入到最右边,插入到 > 右边,插入到 < 右边,这几种情况转移。
P7243: BFS,每次往四个方向扩展。
P1472: \(dp_{i, j}\) 表示 \(i\) 层,\(\le j\) 个节点的方案数,\(dp_{i, j} += dp_{k, j - 1} \times dp_{i - k - 1, j - 1}\)。
P10797: \(y = x\) 答案最优,为 \(2 ^ n\times x\),再特判几种情况。
P5755: 字典树板子,想不到以前 NOI 这么水。
P1733: 交互板子&二分板子。
P5514: 由于 \(a\oplus b\le a + b\),直接全部异或。
P2842: 直接背包就行了。
P1920: 这个算式越往后值越小,给 \(n\) 取一个上界即可。
P1666: \(dp_i\) 表示前 \(i\) 字符串包含 \(i\) 的安全子集数量,容易转移,\(ans = \sum dp_i\)。
P10416: 最终答案为 \(\frac{(r - 2l + 1)\times (r - 2l + 2)}{2}\),特判 \(r < 2l\)。
P1529: 把字符转成数字然后 Floyd。
P2002: 直接 Tarjan 缩点。
P2746: 依旧直接 Tarjan。
P2723: 枚举质数和丑数,找出大于第 \(i - 1\) 个丑数的丑数中的最小值。
P1530: 直接模拟即可。
P2812: 虽然是加强版,但用 P2746 的代码可以直接过。
P1383: 这题根本不用数据结构,分成是否撤销 Undo 操作即可,代码不难。
P1522: 先求出最短路和直径,然后枚举不在同一牧区的牧场,考虑连边并计算新牧区的直径,在这些里面取最小值,
P2724: 找出所有子串,然后按出现次数和长度排序,不过输出非常毒瘤。
P2729: 直接枚举。
P2730: 直接 BFS,建议把魔板看成一个一维的。
P2835: 依旧直接 Tarjan。
P2860: 先大力 Tarjan,答案为缩点后的图中的度为 \(1\) 的点的数量 \(\div 2\) 向下取整。
P3225: 先大力 Tarjan,如果当前连通块中割点数为 \(0\),则要建立两个出口,如果为 \(1\),在非割点的点建立一个出口,如果 \(\ge 2\) 则不用建立。
P3906: 先 Floyd,询问时答案为所有满足 \(dist_{u, v} = dist_{u, k} + dist_{k, v}\) 的点。
P2388: 为含 \(5\) 的个数,由于是阶乘,计数器不要清空。
P1900: 在暴力基础上用 bitset 优化。
P9752: 五维 DP 计数。
P2169: 先缩点,然后拓扑。
P7286: 排序,再维护前缀最大值计算。
P2734: \(dp_{i, j}\) 表示区间 \([i, j]\) 先手最优分数,\(dp_{i, j} = \max(s_j - s_{i - 1} - dp_{i + 1, j}, s_j - s_{i - 1} - dp_{i, j - 1})\)。
P2735: 先求出多边形落在格点边界上的点数和多边形面积,然后使用 pick 定理。
P2736: 直接 DFS。
P7148: 用 BFS 遍历,将当前节点一直翻倍直到大于出度再继续。
P2732: 商品最多只有 \(5\),直接大力五维 DP。
P3545: 反悔贪心,用大根堆维护当前已买的商品,如果能买就买,如果不能买并且堆顶的更便宜,则将堆顶“收回”。
P11328: 反悔贪心,思路跟前一题差不多,不过要先按 \(x_i + l_i\) 排序。
P4053: 依旧反悔贪心,思路也跟前面差不多,不过要按 \(T_2\) 排序。
P11457: 还是反悔贪心,思路依旧差不多,要按 \(s_i + t_i\) 排序。
P1894: 二分图模板。
P1978: 先排序,然后用 set 存当前集合,如果能加入则加入。
P1748: 直接用 set 存当前得到的 H 数。
P1930: 枚举集合点,BFS 一遍,在 dijkstra 求出骑士接国王的代价,要加一维确定当前是否接到国王,在枚举接国王的骑士计算代价。
P2072: \(dp1_i\) 表示表示前 \(i\) 个人最小集体数,\(dp2_i\) 表示前 \(i\) 个人最小危险值,\(dp1_i = \min(dp1_i, dp1_{j - 1} + 1),dp2_i = \min(dp2_i, dp2_{j - 1} + qwq)\),其中 \(qwq\) 表示当前集体宗教数量,超过 \(K\) 退出循环。
P2126: 直接最小生成树。
P2255: 把双调谐器录音机看成两个录音机,按右端点排序后贪心。
P2311: 我爱线段树!
P4030: 一个方阵是巧妙的当且仅当它的 \(2\) 阶子方阵都是巧妙的,可以二维前缀和。
P4369: 容易发现 \(C_n^0 = 1, C_n^1 = n\),可以把前 \(k - 1\) 个用 \(C_i^0\) 表示,第 \(k\) 个用 \(C_{x - k + 1}^1\) 表示。
P3572: \(dp_i\) 只能由 \(dp_{i - k} \sim dp_{i - 1}\) 转移,可以用单调队列优化。
P5195: 直接 BFS,加一维判断是否摘到灌木。
P4265: \(dp_{i, j}\) 表示鞋子 \(j\) 是否可以到达位置 \(i\),暴力转移即可。
P2638: 答案为 \(C_n^{a + n}\times C_n^{b + n}\),需要高精度或者 int128。
P1356: \(dp_{i, j}\) 表示加减 \(i\) 个数是否可以变为 \(j\),\(dp_{i, j} = dp_{i - 1, j - a_i}\ |\ dp_{i - 1, j + a_i}\),\(dp\) 数组第二维记得取模。
P1997: 直接莫队,不过需要两个 \(cnt\) 数组。
P4514: 二维树状数组模板。
P2737: \(dp_j\) 表示 \(j\) 是否可以凑出来,\(dp\) 上界为 \(256 ^ 2 - 2\times 256\)。
P4113: 跟 HH 的项链差不多,需要记录上次出现以及上上次出现,区间和用树状数组维护。
P3253: 将两个栈看成一个数列,每次移动到当前最大值,并删除当前最大值,当前移动的代价为当前点到最大值的距离减去其中删除的个数,用线段树维护。
P3149: 维护逆序对的前缀和即可。
P6870: \(dp_{i, j}\) 表示前 \(i\) 个人,分配 \(j\) 个题至少一个人开心的方案数,\(dp_{i, j} = C_i^j\times (i - 1)^{j - i} + \sum_{k = 0}^j C_k^j\times dp_{i - 1, j - k}\)。
P14006: \(dp_{i, j}\) 表示第 \(i\) 秒,距离为 \(j\) 的方案数,\(dp_{i, j} = dp_{i - 1, j} + dp_{i - 1, j + 1} + dp_{i - 1, j + 2}\)。
P4054: 二维树状数组模板。
P4867: 比普通莫队多了限制,用树状数组维护。
P1527: 二维莫队模板,超级毒瘤,超级卡常。
P3456: 直接 BFS。
P8806: 01 背包基础上按 \(w_i + v_i\) 排序。
P9188: 朴素 \(dp\) 基础上用一个 \(f\) 数组表示上一个 bessie 第 \(i\) 个字符出现的位置。
P1103: \(dp_{i, l}\) 表示 \(i\) 为末尾,选了 \(j\) 本书最小不整齐度,\(dp_{i, l} = \min(dp_{i, l}, dp_{j, l - 1} + |w_i - w_j|\)。
P1108: 先求出最长下降子序列,然后 \(dp2_i\) 表示以 \(i\) 结尾的最长下降子序列的方案数,如果 \(j\) 可以转移到 \(i\) 则 \(dp2_i += dp2_j\),记得去重。
P2687: P1108 双倍经验。
P3205: \(dp_{i, j, 0/1}\) 表示 \([i, j]\) 区间,第 \(i / j\) 个人从左/右进来的方案数,\(dp_{i, j, 0} = [a_i < a_{i + 1}] dp_{i + 1, j, 0} + [a_i < a_j] dp_{i + 1, j, 1}, dp_{i, j, 1} = [a_j > a_{j - 1}] dp_{i, j - 1, 1} + [a_j > a_i] dp_{i, j - 1, 0}\)。
P7914: \(dp_{i, j, 0\sim 5}\) 代表区间 \([i, j]\) 形如 *****,(*****),(*****)*****,(*****)*****(*****),*****(*****),*****(*****)***** 的方案数,转移方程不是很难推。
P1725: 朴素 DP 基础上用单调队列优化。
P7535: \(dp_{i, j}\) 表示前 \(i\) 张钞票差为 \(j\) 获得的钱数,\(dp_{i, j} = \max(dp_{i - 1, |j - a_i|}, dp_{i - 1, |j + a_i|}) + a_i\)。
P7801: 设 \(l = \min(N - L, L)\),\(dp_{i, j}\) 表示 \(i\) 袋土豆共 \(j\) 个土豆的最小价格,就是个背包,答案为 \(\min_{i = 1}^{\sum a_i - 1} [dp_{l, i} \not = \infty](\frac{dp_{l, i}}{i} \times \frac{\sum c_i - dp_{l, i}}{\sum a_i - i})\)
P1005: \(dp_{i, j}\) 表示区间 \([i, j]\) 的最大得分,\(dp_{i, j} = \max(2\times dp_{i + 1, j} + 2\times a_i, 2\times dp_{i, j - 1} + 2\times a_j)\)。
P4170: \(dp_{i, j}\) 表示涂完区间 \([i, j]\) 的最小次数,\(dp_{i, j} = \min([s_i = s_j] \min(dp_{i + 1, j}, dp_{i, j - 1}), \min_{k = i}^{j - 1} dp_{i, k} + dp_{k + 1, j})\)。
P2135: \(dp_{i, j, k}\) 表示区间 \([i, j]\) 后有 \(k\) 与 \(j\) 颜色相同的方块的最高得分,\(dp_{i, j, k} = [color_l = color_j] \max(dp_{i, j, k}, dp_{i, l, len_j + k} + dp_{i + 1, j - 1, 0})\)。
P2339: 先按 \(x_i\) 排序。\(dp_{i, j, 0/1}\) 表示区间 \([i, j]\),在左/右端点,\([i + 1, j]\)/\([i, j - 1]\) 还没交作业的最短时间,转移方程: dp[i][j][0] = min(max(dp[i][j + 1][1] + a[j + 1].x - a[i].x, a[i].t), dp[i][j][0]);dp[i][j][0] = min(max(dp[i - 1][j][0] + a[i].x - a[i - 1].x, a[i].t), dp[i][j][0]);dp[i][j][1] = min(max(dp[i][j + 1][1] + a[j + 1].x - a[j].x, a[j].t), dp[i][j][1]);dp[i][j][1] = min(max(dp[i - 1][j][0] + a[j].x - a[i - 1].x, a[j].t), dp[i][j][1]);。
P10600: \(dp_{i, j}\) 左括号区间 \([i, j]\) 的方案数,若 \([i + 1, j]\) 左括号都没有大于 \(l\) 左括号的右括号,则 \(dp_{i, j} += dp_{i + 1, j}\),若没有要求小于,则 \(dp_{i, j} += dp_{i + 1, j}\)。再枚举一个断点 \(k\),若左括号 \([i + 1, k]\) 对应右括号都没有大于 \(i\) 对应的右括号,并且 \([i, k]\) 的右括号都没有大于 \([k + 1, j]\) 右括号,则 \(dp_{i, j} += dp_{i + 1, k}\times dp_{k + 1, j}\)。
P4765: 先按 \(v_i\) 升序排序(后续为了转移方便,按降序排序)。\(dp_{i, j}\) 表示前 \(i\) 个物品,用了 \(j\) 次魔法的最大收益。\(dp_{i, j} = \max(dp_{i - 1, j}, \min(dp_{i - 1, j - 1} - c_i, v_i - c_i))\)。
P3287: \(dp_{i, j}\) 表示前 \(i\) 棵玉米,\(j\) 次操作,\(i\) 玉米不拔掉最多剩余数量,\(dp_{i, j} = \max_{k < i, l \le j, a_k + l \le a_i + j}dp_{k, l} + 1\),用二维树状数组优化。
P1564: 简单 DP。
P1938: 将点权转换为边权,求出最长路。
P4554: 直接双端队列 BFS。
P2285: 就是一个最长不下降子序列,条件变为 \(dist(x_i, y_i, x_j, y_j) \le t_i - t_j\)。
P2299: 直接 SPFA。
P1144: 在普通 SPFA 基础上加一个 \(dp\) 数组计数。
P2136: 最短路模板,记得判负环,且起点为 \(1\) 或 \(n\)。
P11591: 在最短路的基础上记录离当前节点最近的商店的编号和距离。
P8060: 同余最短路模板。
P6190: \(dp_{i, j, k}\) 表示从 \(i\) 到 \(j\),使用 \(k\) 次魔法最短距离,用矩阵快速幂优化。
P3403: 同余最短路模板。

浙公网安备 33010602011771号