W
e
l
c
o
m
e
: )

[CSP-S 2022] 假期计划

link

\(1-A-B-C-D-1\) 非常对称,我们断开来,分成 \(1-A-B\)\(C-D-1\) 两部分,不难发现这两块是完全一致的。

首先对于每个景点 \(x\) 求出距离它不过 K、且距离 1 不超过 K 的所有点(即对于每个 \(B\),找到满足条件的 \(A\)),设这些点形成的集合为 \(S_{B}\)。由于边权为 1,对于每个 \(B\),我们只需要 bfs 即可 \(O(n+m)\) 得到 \(S_B\),整个过程的复杂度为 \(O(n(n+m))\)

接下来,枚举 \(f_{B, C}\le K\)\((B, C)\),然后暴力枚举 \(S_B,S_C\) 中的点,取最优且满足限制的组合即可。

上面求答案的复杂度是 \(O(n^4)\) 的,需要优化。

不难贪心想到我们只需要取 \(S_B, S_C\) 中最大的值,但是我们可能会从 \(S_B\) 取到 \(C\)\(S_C\) 取到 \(B\),或者从 \(S_B,S_C\) 中取到相同的值,我们需要规避掉这种情况。

考虑先满足从 \(S_B\) 取出来的值与 \(C\) 不同,那么我们顺便维护 \(S_B\) 中的次大值,若最大值与 \(C\) 相同就取次大值,否则取最大值即可。

然后考虑 \(S_C\) 取出的值满足条件,不难发现需要不同的值有 2 个(\(B\)\(S_B\) 取出的值),那么我们还要多维护次次大值,这样就可以保证最优解必然被我们枚举到了。

总复杂度 \(O(nm+n^2)\)

code

posted @ 2022-10-30 17:07  127_127_127  阅读(728)  评论(0编辑  收藏  举报