2024集训D8总结

集训D8总结

讲课内容

内容很多很杂 , 但是大多常规 . 记一些自己不熟悉的 , trick为主 .

园方树

应用场景 在处理无向图与割点有关的连通性问题时 , 因为缩点双时割点被共用 , 所以把每个点双抽象处一个方点 , 构成一棵树 , 方便了快速查询 .

01 Dijkstra

经典 trick , 如果边权只有 0/1 , 可以用deque 代替堆 , 做到少一个 \(\log\) .

同余最短路

一个比较意义不明的算法 .

本身指对于模意义下的背包问题 , 可以通过连边 \(i \to (i+k)\mod m\) 然后跑最短路来实现 . 其复杂度显然是 \(O(nm^2)\) 的 .

然而 , 只要在同余意义下的环上跑正常的 dp 就可以了. 这和最短路做法依赖于 dp 的问题不会出现重复贡献 , 即 \(f_i\) 优于 \(f_i+k\times w\) , 贪心地认为从一个点出发跑一圈再回到自身就可以结束 . 背包显然符合这一点 (事实上如果不符合就没有意义) . 注意为了让环上每一个点都贡献到其他所有点 , 要跑两圈 , 复杂度时$O(nm) $ 的 . 哪怕 Spfa 取伪复杂度或者 dij 也没有它优 .

一般情况下 , 两者相差不大 , 而跑圈可拓展性更优 , 更加实用 .

2-SAT

任何 \(k-SAT\) 都可以归约到 \(3-SAT\) , 然而 \(3-SAT\)\(NP-hard\) . 知道就行 .

生成树

最小 mex 生成树

考虑枚举答案 , 问题相当于判断除了权值为 \(x\) 的边之外剩下的是否联通 , 朴素地可以用并查集维护 .

考虑优化 , 如果使用按秩合并的并查集 , 这个问题是可以撤销的 , 这类似于线段树分治 , 不过直接离线就行 .

复杂度双 \(\log\) .

最小度限制生成树

要求钦定一个点 \(s\) 度数为 \(k\) 的最小生成树 .

发现最小生成树显然易于求极值点 , 为了保证度数 , 考虑 WQS 二分即可 .

BEST 定理

有向欧拉图 \(G\) 中 , 不同欧拉回路总数 \(ec(G)\) . 则 :

\[ec(G)=t^{root}(G)\prod\limits_{v\in V}(deg_v-1)! \]

其中 \(t^{root}(G)\) 是任意一个点内向树个数 .

konig定理

二分图最大匹配数等于最小点覆盖数 .

证明必要性显然 , 充分性可以由构造方法得出 .

构造方法 : 从所有右点找增广路 , 左点在增广路上的 , 右点不在增广路上的 (除了起点 ) .

推论

二分图最大独立集 \(=\) \(n-\) 最大匹配 .

取最小点覆盖的补集 .

DAG的路径覆盖

不相交路径 , 把每个点拆点 \(u_L,u_R\) , 对 $(u,v) $ 连 \(u_L\to v_R\) . 路径数\(=n-flow\) .

从一个角度理解 , 这相当于从每个点是独立的一个路径开始 , 每次拼接 \(ans--\) .

从另一个角度理解 , 这相当于每一个点 \(u\) 连向 \(S\) 代表需要 \(1\) 出度 , 连向 \(T\) 代表需要 \(1\) 入度 . 通过匹配尽可能满足需求 , 其余的用路径端点补 .

相交路径floyd 求传递闭包 , 同上 .

老鼠进洞模型

其实就是费用流 , 抓住退流的有限种情况 , 该抽象时就直接把量抽象出来 . 注意抽象物品的构造 , 一旦构造出把一条增广路看作一个抽象物品进行选择的思路基本上就保证了正确性 .

考虑从左向右贪心地加老鼠和洞 . 当退流情况比较复杂 , 可以考虑先增广 , 再退流 .

因此先考虑 \(x_i\) 向左匹配 \(y_i\) , 权值为 \(x_i-y_i\) , 用堆 \(Q_1\) 维护 \(-y_i\).

再考虑把向左匹配变成向右匹配 , 相当于一个靠右的洞 \(y_i\)\(x_i\) 处提取了一条增广路 , 这条路径想要优 , 就需要构造一个负环 , 设 \(y_i\) 匹配时代价是 \(w\) , 则增广代价是 $-w+(y_j-x_i) $ , 因此每次匹配老鼠时 , 用 \(Q_2\) 维护 $-w-x_i $ 用于退流 , 考虑退流后再次选 \(y_j\) 的代价 , 相当于退回了这段代价 , 于是 \(Q_1\) 维护的是 \(w+x_i-2\times y_j\) , 这完全满足一个平凡洞的性质 , 可以递归选择 , 于是保证了退流正确性 .

训练记录

有大量原题 , 重做思路后 , 有意义的就写一下 .

题太多没法详细写了 , 抓一下核心思想 .

CF19E

常规考虑环 , 考虑把所有环扔在 \(tarjan\) 树上考虑简单环 . 考虑树边:

  • 所有简单奇环必须跨过这条边 . 必要性显然 .
  • 不能有偶环跨过这条边 , 否则会与奇环符合 , 仍然是奇环 .
  • 考虑充分性 , 首先所有简单奇环都被破坏 , 考虑复合奇环要用一奇一偶复合而成 , 而没有偶环跨过 , 代表了把偶环两端点扔在某一端 , 显然无法再与奇环复合 .

找必要条件十分重要 .

CF412D

直接后序 \(dfs\) 即可 . 性质感很强的构造题 , 首先很容易联想到拓扑排序 , 但是不保证 DAG .

结合没有二元环的性质 , 可以联想到直接 dfs . 显然不会存在后续边直接覆盖自己 .

WC2011最大xor和路径

典中典题 . 用 xor 性质转化 , 发现来去路径会抵消 , 只有路径中的环是有贡献的 .

提取出所有简单环 , 扔到线性基里 .

P4819

妙题 .

首先可以从手玩开始得到启发 , 发现一旦从全盲状态确定一个人 , 所有这个人能达到的点全能确定 , 同时其余部分不能确定 . 这提示我们找管辖的点更多的点 . 于是缩点拓扑 , 找出所有必须要查询的点 , 就是所有的 \(0\) 入度点 . 而其余部分就自然解开了 .

到这里 , 并没有结束 , 测试样例可以发现总与正确答案差一点 . 关键是排除法 . 如果再若干个必须点中 , 有一个大小为 \(1\) , 而且用其他必须点可以解到只剩这一点 , 那么最后这一点可以排除法选 . 单独特判即可 .

APIO2018铁人两项

园方树的经典例题 .

先手玩 , 发现为了让两条路径没有交点 , 只要让它们不共同覆盖一个 "无关" 割点即可 , 更确切一些 , 中间点应该是路径上的点双内的点 .

割点 , 整体多组询问 , 这足以提示使用园方树 .

发现对于一对 $(st,ed) $ , 设经过方点 (也就是点双) 为 \(B_1\cdots B_k\) , 答案为

\[\sum\limits_{1}^{k}sz(B_i)-(k+1) \]

其中 \(k+1\) 是路过的重复算的割点加上端点 , 也就是圆点数量 . 这可以简单 dp 解决 .

园方树还是比较易于识别 , 侧重于 什么问题该想到什么算法 的那种基本功 .

P3403

发现 \(x,y,z\) 值域与 \(h\) 相差很大 , 同时想到 , 对于一个数 \(x\) , 其意义只有不断平移 \(x\) 位 . 因此可以想到维护 \(\mod x\) 意义下每一个值是否能达到 , 然后用 \(x\) 带着这个小值域内的问题向上跳 .

问题在于 , \(\mod x=i\) 的不同位置 , 其起始位置有 \(py+qz\) , 不是完全对齐的 , 因此可以对每一个单独考虑 , 发现直接计算就可以算出单独一个的贡献 .

剩下就是同余最短路了 , 跑圈即可 .

SCOI2011 糖果

最长路差分约束模型 .

发现 SPFA 复杂度过高 , 发现边有特殊性 , 即只存在 0/1 . 因此不允许存在非 0 环 . 可以先缩点把不合法判掉 .

进一步拓展 , 直接在 DAG 上 dp 就好了啊 .

CF888G xor-mst

很重要 , 很好的一道题 . 可惜"第一次做" 正向思考那种感觉没拿到 .

考虑最小生成树的过程就是贪心的过程 , 显然在边上贪心难以优化 , 结合对 xor 的特殊性质 , 考虑优先合并 xor 小的点 .

而对于一个点 , 想找 xor 小的点 , 启发到字典树并不难 .

那就从字典树精细考虑怎么做 . 首先不要忘记贪心 , 两个点之间肯定是在 xor 尽可能小出匹配 , 而同一个子树内两个点就不可能在这个子树之外合并它们的连通块 .

也就是说 , 任意两点联通时刻必然是在跨的 \(LCA\) 的路径被考虑到的时刻 . 因此在 trie 的节点出要做的就是找出最小的一条合并左右子树的路径 .

找路径暴力做 , 复杂度 \(O(n\log ^2 n)\) .

反向用 \(brouvka\) 算法可以证明正确性 , 但是还是正向思维更加重要 .

NOI2021 路径交点

首先这个形式就很接近 LGV 引理 , 但是还是不急着反向证明 .

先研究部分分 , 考虑只有两层 , 显然就是在临界矩阵中找一一匹配 , 交叉点偶数-奇数 , 本身就是 \((-1)^\sigma\) 的意思 , 因此直接对邻接矩阵求行列式就是正确的 .

考虑 $n_i $ 相等 , 考虑单独做相邻两层 , 答案相乘 , 根据乘法分配律 , 答案仍然正确 , 因此直接把 det 相乘 .

考虑正解 , 现在邻接矩阵不全是方阵了 , 不能算 \(det\) , 但是我们有

\[det(AB)=det(A)det(B) \]

如果联想能力足够强 , 完全可以猜想到把临界矩阵相乘再求 \(det\) .

否则还是需要一个找性质过程 . 我们把交叉点不仅仅理解成逆序对 , 而是一种交换操作 , 每次交换 , 从逆序不逆序发生了切换 , 而逆序对个数的奇偶性完全对应了交换操作的 .

换句话说 , 直接求出 \(G_1\to G_k\) 的图 , 和原图没有本质区别 , 同一种方案的逆序对奇偶性是不会发生变化的 .

因此可以矩乘得到这个图再求 \(det\) .

事实上 , 有了刚才这个结论 , 就可以套用 LGV 了 , 整个思路成功闭环了 .

P3358

很体现网络流意义的一道题 .

发现这个东西 , 体现了一种 关系 和一种 限制 , 这里发现要限制同一段内不同时覆盖超过 \(k\) 个区间 , 可以理解成流 \(3\) 条流 , 而 \((l,r)\) 发现直接从源点 , 汇点流并不能很好地刻画 . 于是转化思路 , 让数轴变为提供 \(k\) 条流 , 连边 \(l\to r\) 表示分走一条流 , 总共可以分 \(k\) 流 .

总结

充满了回顾的做题体验 . 一方面 , 确实对原来的很多题有了更深刻很多的理解 , 同时也有从头想这些题时基本功不足 , 没法深刻体会这些题的妙处 . 总体而言要重视第一次做 , 这生成了正向思路 , 后面分析 , 反思这种正向思路 , 才能有提升 .

posted @ 2024-12-21 22:10  youlv  阅读(17)  评论(0编辑  收藏  举报