刷题总结

1.如果有类似与 \(f{i,j,k}=[0,1]\) 的而且要求 \(f{i,j,k}=1\)\(k:{max,min}\)情况,可以转成 \(f{i,j}=k\) ,如果有值就代表原来是 1。

2.如果区间 DP 有一个区间不好做,考虑对于另外一个区间进行 DP。

3.如果图上点权是一个排列,考虑将点权连边。

4.如果有类似于每次取出 \(min/max\) 元素,操作后再放回去,可以考虑将优先队列整成多个队列,这样可以省掉一只可爱的 log。

5.对于一个 DP,如果要从多个地方转移,我们可以尝试分离,把每一项都分离到只和自己有关,单独跑一遍后再合并。

6.\(h[i]\) 表示 \(s[0...i-1]\) 的哈希值,\(p[i]\) 表示 \(base^i\),那么子串 \([l,r]\) 的哈希值为:hash(l, r) = h[r] - h[l-1] * p[r-l+1]

7.对于一堆数要从 \([l,r]\) 选并且不能重复选,并且值域不大的情况下,我们可以按照 \(l\) 排序然后枚举值域,每次碰到一个左端点就塞到堆里,每次选右端点最小的。

8.树形 DP 套路:\(dp_{x,j}=combine(dp_{x,j−k},dp_{y,k})\)

posted @ 2025-11-07 19:24  MistyPost  阅读(11)  评论(1)    收藏  举报