Loading

NOIP模拟赛 #5

被 t2 干崩了

A

给定一张若干个边仙人掌组成的无向图,至多断掉其中 \(k\) 条边,求最大连通块数目。

\(3\le n\le 10^6, \ 0\le k\le m\le 2\times 10^6\)

先断桥,再断环,断环的第一条边没有贡献。

B

给定 \(n, m, k\)\(m\) 个数,你需要将 \(1\sim 2^n - 1\) 划分给两个人 A 和 B,满足若一个人被得到了两个数 \(x, y\) 则必须得到数字 \(x\text{ or } y\)。此外,要求其中 \(m\) 个给定的数必须划分给 A,并且 A 恰好得到 \(k\) 个数,求一种划分方案或无解。

\(n\le 18, \ m,k\le 2^n - 1\)

步步递进分析。从最表面观察,不妨钦定选择数字 \(2^n - 1\) 的人是 A,那么对于 B 来说一定存在一个二进制位 \(x\) 满足该位为 \(1\) 的数字都分给了 A。可以反证,如果不存在这样的 \(x\) 则 B 的所有数字 \(\text{or}\) 起来等于 \(2^n - 1\),不合法。

因此,A 将得到 \(2^{n - 1}\)。去掉 \(x\) 这一位之后,剩下 \(2^{n - 1} - 1\) 个数,发现是子问题,可以通过 \(m = 0\) 的部分。

\(m > 0\) 时,反过来就是这 \(m\) 个数不能分配给 B,可以考虑状压。设 \(f_S\) 表示剩下没有去掉的二进制位集合为 \(S\),此时是否存在一种合法方案。转移枚举当前去掉的位 \(x\),利用 \(k\) 的第 \(\text{popcnt} (S)\) 位是否为 \(1\) 判断一下是分给 A 还是 B。如果分给 B,判断一下是否存在数字是 \(S\) 的子集,并且不是 \(S\backslash \{x\}\) 的子集,这个条件可以通过对 \(m\) 个数做一次高维前缀和完成。时间复杂度 \(\mathcal O(2^nn)\)

  • 启示:分析表面,寻找子问题。

C

一个长度为 \(n\) 的网格纸条,每个格子有一种颜色。共 \(q\) 次询问,每次给定 \(u, v\),求从 \(u\) 走到 \(v\) 的最小时间。行走时,每个单位时间可以走一步到与当前格子颜色相同的相邻格子,或者将某一个格子染成任意一种颜色。

\(1\le n,q\le 10^6\)

卡常题真下头。

一种方法是无脑将挡墙格子颜色改成下一个格子的颜色。考虑两个格子若颜色相同,可以先将中间的格子颜色推平,这样可以节省一个单位时间。这样转化为选择若干对颜色相同的格子对,满足每对格子互不交叉,可以直接倍增。

D

一棵树,初始时所有点都是黑的。共 \(n - 2\) 次操作,每次将一个点染成白色,每次操作后求所有黑色点之间的距离最小值,以及有多少对这样的黑点,强制在线。

\(2\le n\le 5\times 10^5\)

树上领域问题,显然需要先建立点分树。

总答案应是点分树每个子树的答案综合起来。考虑对于上每个点 \(u\),求出其点分树上的子树中所有黑点与该点的距离,用桶统计,并维护 \(p_u, q_u\) 表示子树内黑点与 \(u\) 的最小距离和次小距离,那么第一个答案为 \(\min\limits_u \{p_u + q_u\}\),第二个答案也不难用桶算出。由于答案不减小,总答案也可以用桶维护。

时间复杂度 \(\mathcal O(n\log n)\)

posted @ 2024-11-05 16:32  Lgx_Q  阅读(16)  评论(0编辑  收藏  举报