杂记

  • 钦定顺序特别重要,这不仅关乎到可能的去重,也关乎到简化问题。当然,错误的顺序可能会使问题更复杂(来自图上状压计数)。

  • 如果觉得题目无从下手,考虑 DP(来自蜜蜂搬家)。

    • 尝试着设计一个不管有多复杂的 DP 状态,然后一点一点把握题目中各个要素的关系,找到转移的途径。

    • 考虑尽量简洁地描述题目要素之间的关系,不管这种关系看起来多么地不可转移。那是实现的事情。

    • 一定要敢 DP!

  • 如果有机会——如果有机会——尽量不要把算法大改特改。请最好保持它本来的样子——这样内聚性比较好,调起来也比较好调,不会出现难以名状的客制化错误(来自某个线段树优化长剖,其中由于链长最大为 \(m\) 的题设改动了长剖的结构却没有注意到,导致剖假了)。

  • 准备扫尾的时候好好想想你的扫尾复杂度对不对(来自最短路,使用了回溯到 \(S\) 求路径长度的方式,复杂度 \(O(n^2)\)...work 部分的复杂度是 \(O(m)\))!!!

  • 复杂度平衡。复杂度平衡。复杂度平衡。

  • 拓扑排序也是排序!倒不如说它是验证序的存在性的。存在的话随便找一条。

  • 不要老是试图对不要求 \(O(1)\) 的题目猜结论然后打补丁(来自 \(\text{CF1698C,CF1728D}\))。

  • 分块之于线段树,恰如齐纳协议之于 OGAS。它只有一层,明白吗?想想分块的特点是什么——块内暴力!线段树做得到吗?区间太大就做不到。分块恰恰像是舍弃了嵌套,换取了暴力...

  • 给出一种维护树上若干点是否共链的做法:维护一个 set,内部关键字为到起点的距离,加的时候求 \(lca(s,x)\oplus lca(x,t)\oplus lca(s,t)\),可以证明这就是这三条路径的交点(如果有),对等于 \(s/t/x\) 分讨,如果改 \(s\) 那么对距离做整体偏移。删除时同理,注意整体偏移。

  • 注意检查 fileit() 的注释是否去掉了,以及,注意检查 ForFort 之间的差异。

posted @ 2023-02-21 08:51  未欣  阅读(34)  评论(0编辑  收藏  举报