2024.10.2 总结(集训;DP)

一些要注意的

  • 访问之前判会不会数组越界。(背包)

  • 不要忘了 DP 初值,如:背包初值。

  • 稍微推柿子(又如 昨天比赛 那道 T4)。https://www.cnblogs.com/xsl19/p/abc221g.html#:~:text=ABC221G Ju

  • 数组开够。可以适当地多开一点。但是不要开炸了(比如开很多个小矩阵的时候)。

  • 用同一个数据结构(比如数组或线段树)维护当前的 DP 数组时,分清楚什么要查之前的(要放在修改前面),什么要查之后的(要放在修改后面)。如:AT_arc073_d [ARC073F] Many Moves(我的代码)。

  • 在线段树内部写,让代码更好看。如:https://www.luogu.com.cn/article/oy96wpf2

  • 不要忘了缩点后一个点维护的信息可能是多个点、多条边的。
    (可能?)要算上(要考虑)。

  • 考试的时候,先通读一遍题,然后想出一道写一道。不要堆很多想法但不写。不要没想清楚就自以为会了,要想清楚[细节](???)。防止没想清楚以为自己想好了;防止 写、调、改 不完。(昨天下午比赛的教训)

DP

(这种是引用的水哥课件里的)

  • 相对简单:优化[(如:DS 优化、状态设计优化)](???)。
  • 相对较难:单调性。
  • 相对更难:[找](?)性质。

T1 P2339 [USACO04OPEN] Turning in Homework G

……时间之后 倒过来 -> ……时间之前。-> 二分结束时的时间(二分答案)。(???(还没懂))

T2 P8867 [NOIP2022] 建造军营

[割边问题。](?)-> 边双缩点,得到一棵树。

树上选连通块。注意不在连通块里的边也可以选!

两种做法。我的做法是 DP 中维护的东西乘 \(2 ^ {- 连通块中边的数量(不完全是,新图可能有重边,重边只要不是一条都不选就行)}\)(注意有负号),最后乘 \(2 ^ {边的总数}\)

另一种做法。

注意:点 u 是缩完后的点。自身内部有点数和边数

每种状态涵盖的情况太多不太好转,一般就加状态数或者增加限制。

一个一个子结点更新。

T3 CF1153F Serval and Bonus Problem

看数据范围猜做法、状态。

\(l\) 没必要,不妨用 \(1\),最后乘 \(l\)

结论:长度为 \(1\) 的线段,随机撒 \(n\) 个点,两个相邻点之间([开头结尾这两个点也考虑进去](?????))距离的期望是 \(\frac {1} {n + 1}\)。(???)

T4 AT_abc221_g [ABC221G] Jumping sequence

直接背包的话 \(x, y\) 都要丢进状态,状态太多,不好做。(实际上我还不知道能不能背包)

[[(曼哈顿距离转)](???????(好像是我觉得))切比雪夫距离:把 x 和 y 联系起来。](好像是水哥原话的意思)发现转换后横纵坐标都可以任意变,于是可以把它们分开处理。

曼哈顿距离与切比雪夫距离相互转化:https://oi-wiki.org/geometry/distance/#曼哈顿距离与切比雪夫距离的相互转化

距离:曼 转 切。(?????)

等价转化来减小范围(减少状态数) (使状态的两维独立)

T5 AT_arc073_d [ARC073F] Many Moves

什么都想不出 -> 设计一个复杂的 DP -> 简化。

在这题中:\(f _ {i, j, k}\) 表示处理了前 \(i\)\(x\),一个棋子在 \(j\),另一个棋子在 \(k\) 的最少时间。

发现一定有一个棋子在 \(x _ i\)。于是可以去掉一维,\(f _ {i, j}\) 表示处理了前 \(i\)\(x\),两个棋子分别在 \(j\)\(x _ i\) 的最少时间。

写转移,发现可以复用 DP 数组,拆绝对值(分讨),线段树优化即可。

T6 P4042 [AHOI2014/JSOI2014] 骑士游戏

转换成图。

(听说[要建虚点,倒着跑最短路,即用最短路跑 DP](???????),但我没懂。)

不存在一个点自己更新自己,但是仍有更新顺序的问题。(\(f _ i\) 的初值是魔法攻击的体力消耗值)两种攻击的消耗都是正的,于是发现对于某个 \(i\),只有对它会变出的所有 \(j\)\(f _ j\) 都比 \(f _ i\) 小时才能用这些 \(f _ j\) 更新 \(f _ i\),于是用小根堆维护即可。这个做法本质上是 Dijkstra 算法的一个变形,是贪心得到 DP 的转移顺序。(这部分绝大部分来自:https://www.luogu.com.cn/article/pcsgf8yi ;水哥的课件里也写的这个做法)

用最短路算法的变形跑 DP:

  • 可贪:Dijkstra。
  • 不可贪:SPFA。

似乎发现了一个 Dijkstra 最短路做法:https://www.luogu.com.cn/article/fr94yxlq

另有须队的要建虚点的最短路(听说是点分了两类,虚点和普通点)做法。

T7 P1912 [NOI2009] 诗人小G

式子复杂拆不开不好优化 -> 想(可猜)(可打表来看)决策单调性 -> (可以)分治。

分治:状态 \(i\) 的区间、决策点的区间,每次在 \(i\) 的区间里找中间点 mid 来分治,[注意决策点要把当前决策点包含进新的两个区间里(不是完全把区间分成两半)](?)。分治本身的时间是 \(O(n \log n)\) 的,因为 \(i\) 的区间从中间分,得到的那棵树很规整,一共就 log 层;决策点区间得到的树可能不规整,但分到 \(i\) 的区间长度为 \(1\) 时就不会继续往下分了,所以层数和 \(i\) 的区间那棵树一样,也是 log 层;每一层的时间复杂度大概是 \(n\)

(上面的时间复杂度分析没有考虑找每个决策点的过程中会不会带 log,是认为移动一次是 [\(O(1)\)](?)来分析的。)

决策单调性好像还有另外的做法。

Update: 这题不能用上面的分治。因为转移方程里 \(f _ i\) 需要用前面的 \(f _ j\) 来更新,[除非区间中间的点是整个序列的开头](???),没法直接求区间中间的 \(f\)

T8 P3262 [JLOI2015] 战争调度

数据范围(实际上是与哪些有关,“哪些”很少,即把有关的压进状态,状态较少,可以处理)很小 -> 状压。

T9 CF868F Yet Another Minimization Problem

划分为一些子段的问题,套路设状态。

有决策单调性。

还没懂。

T11 P4749 [CERC2017] Kitchen Knobs

(看文字)

  1. 转化题意。循环、周期,考虑取模。一次操作是区间加任意值,使得每个数 \(\bmod k = 0\),问最少多少次操作。
  2. 区间加 -> 差分,转成两个点一加一减。容易证明充要条件是差分数组中每个数 \(\bmod k = 0\)
  3. 整一个暴力六维状态 DP。
  4. 贪心优化,\(n ^ 6\) -> \(n ^ 3\)

T12 CF908G New Year and Original Order

数位 DP,但不好直接统计答案。

拆贡献,对每种数字分别算它的贡献。

T13 P8392 [BalticOI 2022 Day1] Uplifting Excursion

范围较大。[贪心](???)求区间(范围),再 DP。

之前也遇到过有问题的 DP 求上界再搜索的题。这种题大概是用一种算法求范围在用另一种更求准确的答案。

T14 P4007 小 Y 和恐怖的奴隶主

数据范围里,有值很小,有值很大 -> 考虑矩阵快速幂(转移状态)。

多组数据但转移矩阵相同,初始是向量,预处理出转移矩阵的 [\(2\) 的幂](???????) 次方。

向量乘矩阵似乎是 \(O(n^2)\) 的。

直接并行运算

似乎是指把多个向量放到一个矩阵里去算。


完结撒花。

2024.10.2 & 2024.10.3

posted @ 2024-10-02 16:01  huangkxQwQ  阅读(12)  评论(0编辑  收藏  举报