20260321 NOI 模拟赛
20260321 NOI 模拟赛
https://htoj.com.cn/cpp/oj/contest/detail/problem?cid=22704952275712
Problem A. 城市建设问题
考虑按 \(A_i\) 大小关系给图定向为 DAG,每次加入一个入度为 \(0\) 的点,设当前点集为 \(S\),可以以 \(|S|\) 的代价获得 \(sum(S)\) 的收益。一边状压一边背包即可 \(O(2^n nm)\)。
这个过程可以抽象为选取若干个集合 \(S_1\subsetneq S_2 \subsetneq S_3\subsetneq \cdots \subsetneq S_n\) 出来做完全背包。这个包含关系太难处理了,但是可以发现 若 \(S_i,S_j\) 之间没有包含关系,那么换为 \(S_i\cup S_j,S_i\cap S_j\) 一定不劣,所以可以直接扔掉这个条件。\(O(n2^n+nk)\)。
Problem B. 字符串修改问题
转化为求 \(\max(len(s)\times(occ(s)-1))\),\(occ(s)\) 为 \(s\) 不重叠出现的次数。
对于一个 \(len(s)\) 求答案,在 SA 上把相等子串染为同一种颜色,然后扫一遍序列即得出答案。
然后对所有的 \(len\) 求答案。注意到 \(f(i)\ge f(i+1)\) 且 \(f(i)\le \frac n i\)。考虑类似线段树的过程,若该节点 \(f(l)=f(r)\) 就返回。
考虑第 \(d\) 层,最多有 \(c=2^d\) 个节点。
前 \(2^{d/2}\) 个节点都可以出现。\([2^{d/2},2^d]\) 这些节点的节点值都 \(\ge \frac{n}{2^{d/2}}\),那么只有 \(O(2^{d/2})\) 个节点值。于是一层只有 \(O(2^{d/2})\) 个节点,由主定理 \(T(n)=T(n/2)+O(\sqrt{n})=O(\sqrt{n})\) 得总复杂度为 \(O(n\sqrt{n})\)。
Problem C. 背包问题
把每个颜色分到一起,最大和次大合并为一个重量为 \(2\) 的物品,选了 \(2\) 才能选剩下的 \(1\)。
由于重量只有 \(1,2\),可以先尝试按性价比贪心选,直到将要溢出。此时剩余容量最多只有 \(1\)。
如果恰好填满就是最优的,因为我们把性价比最大的前 \(k\) 个都选进来了。否则,我们有三种决策:+1,-1+2,-2+3。
设扔掉的物品集合为 \(S\),新加入的为 \(T\)。若 \(S,T\) 内都有 \(1\),删掉这两个 \(1\) 一定更优;若只有 \(S\) 内有 \(1\),那么只保留一个 -1+2 一定更优;若只有 \(T\) 内有 \(1\),那么只保留一个 -2+3 或一个 +1 一定更优。
set 维护即可。

浙公网安备 33010602011771号