Solution Set - NOI级别真题选做
[NOI2007] 社交网络
key:Floyd
Floyd求出任意两点间最短路,以及最短路的条数。求点 \(k\) 的答案时枚举所有点对 \(i,j\),若 \(dis_{i,k}+dis_{k,j}==dis_{i,j}\),则以 \(\frac{cnt_{i,k} \times cnt_{k,j}}{cnt_{i,j}}\) 加入答案。
[NOI2009] 管道取珠
key:DP
状态设计有点意思。想象有两个管道,每次两个管道各出一个球,则所求即为两个管道每次出球都相同的方案数。状态设计为三维,然后把第一维压掉。
[NOI2009] 变换序列
key:基环树
首先根据 \(d_i\) 求出可能的 \(t_i\)(至多两个取值),然后建二分图。建图时允许重边,这样每个左部点的度都为2。只用求该图字典序最小的完美匹配。分出这个图上的连通块,必须每个连通块都是基环树才有解。是基环树时,找到环上编号最小左部点,让它的匹配点取较小的一个即可。
[NOI2009] 诗人小G
key:四边形不等式优化
模板题。
[NOI2010] 海拔
key:平面图最小割
显然所有点的海拔只可能是0或1。然后转对偶图最短路。模板题。
[CTSC2010] 星际旅行
这是黑?这是黑?这是黑?
key:思维题
注意到最后那个条件,可以先遍历整棵树,然后选择一些边重复走,使其两端点的 \(h_i\) 值都减一。这个步骤贪心地完成:以 \(0\) 为根,先让叶子结点尽可能用光(同时耗费父亲结点)。遍历整棵树,到达点 \(u\) 时相当于 \(u\) 到 \(0\) 的路径少走了一遍,这样可以把路径上(不含 \(0\))的所有点的 \(h_i\) 值加一。可以在DFS进入一个点时加一,离开时减一。考虑这样操作的影响。加一时优先与儿子匹配,如果不行就再与父亲匹配,再不行就不管了。减一时如果能减直接减,否则优先与父亲匹配(少重复一次),不行就再与儿子匹配。只要在儿子上记录它与父亲结点的匹配次数即可。
[NOI2009] 植物大战僵尸
key:拓扑排序,最小割
依照题意建有向图,\(x\) 向 \(y\) 连边表示要攻击 \(y\) 必须先攻击 \(x\)。从源点向最右侧的点连边,跑拓扑排序求出所有可能攻击的位置。然后对原图所有边(与源点无关)建反向边,流量INF(防止割断);源点向所有点连流量为 \(D\) 的边,所有点向汇点连流量为 \(D-\) 点权 的边,跑最小割即可。这里 \(D\) 是一个合适的常数,使得所有流量为正。
[WC2009] 最短路问题
key:线段树
难。情况多到离谱。建议摆烂。
[CTSC2010] 产品销售
这是紫?这是紫?这是紫?
key:模拟费用流
费用流模型是好建的,然后完全不会。看题解叭。