刷题总结
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})\)。
可以自由转载

浙公网安备 33010602011771号