9月杂题选做

大概就是一些自己找到的题,做过之后觉得有意义就记下来了。

在记新题之前会先看看旧题,确保自己能从观察层面上重新发明这个思路而不是走“知识框架”,重要的不是记下来,而是利用之前做过的题的切入角度和这道题切入角度的差异来想明白“还有这样的思路”,取得非线性的涌现。

应该是和代码源题单以及模拟赛不交的,可能会撞一些联考但是无所谓了。


QOJ17760

tag:通信、构造、鸽巢原理、Ad-hoc。

很有趣味。

题面是英文的 PDF,一句话题意就是 Judge 给定 Alice 一个集合 \(S \subseteq \{1,2,3,\dots,n\}\),保证 \(|S| = k \lt \frac{n}{2}\)。Alice 恰好增加一个位置 \(i \notin S\) 进 \(S\),Bob 直接获得这个增加后的集合,需要找出 Alice 增加的是哪个位置,Alice 和 Bob 的策略可以事先商量,但是信息无法互通。\(2 \leq n \leq 10^6\)。

考虑把集合转化为一个长度为 \(n\) 的 \(0/1\) 序列,一个位置 \(i\) 是 \(1\) 当且仅当 \(i \in S\)。

那么首先考虑 Alice 如何操作,因为 Bob 信息太少了所以难点显然不是还原而是构造,需要找到一些不变量使得 Bob 可以直接确定这个位置。

容易想到将 \(1\) 视为 \(1\),\(0\) 视为 \(-1\),二维平面上横轴是下标纵轴是前缀和,形成一条折线。则因为 \(k \lt \frac{n}{2}\) 所以所有 \(1\) 最终会被抵消掉的,换言之如果一开始的位置视为 \(0\) 那么前缀和序列只有不超过 \(\frac{n}{2}\) 种大于 \(0\) 的取值,这个意味着,前缀和序列中的正数部分绝对值任何时刻都不可能大于负数部分的绝对值。

因此,可以直接上下滑动基准线,由 \(k \lt \frac{n}{2}\) 的分析我们意识到正贡献必定是小于负贡献的,鸽巢原理得到必定有一个整数位置可以使所有正数恰好被负数抵消,则 Alice 在最后一个与基准线的交点处,即前缀和序列最后一个为 \(0\) 的位置加一个数,Bob 就可以直接通过新的 \(k + 1\) 还原出来了。

更说人话一点,就是将 \(i \in S\) 视作左括号,\(i \notin S\) 视作右括号,因为 \(k \lt \frac{n}{2}\) 所以所有左括号均可以被匹配,剩下 \(n - 2k\) 个未被匹配的右括号。则 Alice 可以选最后一个未匹配的右括号,将其改为左括号,Bob 可以直接对收到的集合从左到右做贪心匹配,找最后一个位置,也即匹配完输出栈底。时间复杂度均为 \(\mathcal{O}(n)\)。

submission


QOJ16947

tag:计算几何、分块、Ad-hoc。

因为限制是欧氏距离不超过 \(r\),考虑以 \(\frac{r}{2} \times \frac{r}{2}\) 的大小对平面分块。

那么任意一个块 \((i,j)\) 内的点仅能与 \(|x - i| \leq 2, |y - j| \leq 2\) 的块 \((x,y)\) 内的点连边。

对于任意一个块 \((i,j)\),如果其中有至少 \(3\) 个点,那么必定存在奇环,可以直接求出答案,称为重块。

如果其中只有 \(\leq 2\) 个点,那么无法确定,称为轻块。

对于一个轻块,可以与邻域内所有轻块内的点暴力连边,扩展域并查集维护判定二分子图,与邻域内重块之间只需要判定是否能联通,不需要实际连边。所以总共的连边次数是 \(\mathcal{O}(n)\) 量级的。

时间复杂度 \(\mathcal{O}(n \alpha(n))\)。

submission


P9393

tag:贪心、Ad-hoc、SOS-DP。

首先有几个观察:

  • 因为对每个位置进行覆盖操作,所以对每个位置只有最后一次有效操作是重要的。
  • 因为是二进制下取值最大,所以考虑逐位贪心。

那么,从高到低逐位贪心,在确定高位之后看当前位能否被置为 \(1\)。从后往前分析每次操作,设当前固定的集合为 \(T\),问题等价于是否存在一个操作选取序列,使得最终 \(T\) 内的所有位置均为 \(1\)。

从后往前分析这个序列,如果某一时刻位置 \(i \in T\) 被置为 \(1\),并且这一时刻以后不存在一次将它置为 \(0\) 的操作,那么这一位就不对前缀的选择产生任何限制了。换句话来说,我们从后往前维护一个需要考虑的位置集合 \(K \subseteq T\),每次操作相当于选出 \(n\) 个给定操作串中的一个 \(X\),要求对任意 \(i \in K\),不能有 \(X_i = 0\),然后对于 \(X_i = 1\) 的 \(i \in K\),将其从 \(K\) 中删去。

最终只需要判断 \(K\) 是否为空,以及 \(K\) 如果非空,剩余部分是否能被询问给出的 \(S\) 的 \(S_i = 1\) 部分完全包含。

操作过程中我们只在乎至多 \(2^m\) 种状态之间的可达关系,极小的转移边是 \(\mathcal{O}(n)\) 的,所以考虑对状态 DP,可以设 \(f(T)\) 表示集合 \(T\) 按照最优顺序操作到不能操作为止,剩下的位置集合,以及 \(g(T)\) 表示从 \(T\) 开始,进行恰好一次操作能删去的位置的并。容易发现 \(f(T)\) 就是 \(g(T)\) 复合的结果,因为只有 \(m\) 个二进制位,并且每次操作 \(T\) 大小不增,所以有限次复合之后 \(g(T)\) 一定会到一个不动点,也就是我们可以直接 DP 求出 \(f = \lim\limits_{k \to + \infin} g^{k}(T)\)。

具体地说,先考虑如何求 \(g\),这等价于对每个操作做高维后缀或,直接 SOS-DP 做到 \(\mathcal{O}(m2^m)\),然后 \(f\) 的转移相当于每次从 \(T\) 转移到可达的前驱节点,即删去一步以内能删的集合并,有 \(f(T) \leftarrow f(T \oplus g(T))\)。

这样,每次询问只需要从高位到低位,考虑加入这一位之后对应的 \(f(T)\) 是否包含于 \(S\) 即可,时间复杂度 \(\mathcal{O}((n + q)m + m2^m)\)。

submission


ARC103F

tag:构造、Ad-hoc、*2600

首先可以考虑刻画出距离之和的式子,也就是 \(D_i = \sum_{j \in \text{son}_i} (D_j + 1)\)。注意到如果要直接依据这个构造,需要将 \(+1\) 拆出来变为 \(D_i = \deg_{i} + \sum D_j\) 状物,这无疑是不好做到 \(\mathcal{O}(n^2)\) 以下的。

但这提醒了我们对于一棵给定的树,\(D_i\) 的变化形式:假设存在一条邻边 \((u,v)\),现在要从 \(u\) 走到 \(v\),那么变化量 \(\Delta_{u,v} = \text{siz}(u) - \text{siz}(v) = \text{siz}(u) - (n - \text{siz}(u)) = 2\text{siz}(u) - n\)。也就是说,只要当前点 \(u\) 的子树大小确认,又因为 \(D\) 互不相同,必定可以找到唯一的父节点 \(v\),从 \(u\) 连接 \(v\) 使得 \(v\) 满足条件。也就是对于此时构造好的树的根节点 \(u\),只需要找是否有权值为 \(D_u + 2 \text{siz}(u) - n\) 的不在当前子树内的点 \(v\)(这个肯定的,对于 \(D_i \gt D_j\),\(i\) 不可能是 \(j\) 的父节点),如果有就连边 \((u,v)\),否则必定无解。

又因为 \(\max\limits_{1 \leq u \leq n} D_u\) 对应的点必定是叶子节点(考虑 \(\Delta \gt 0\) 的充要条件不难得到),所以这个点的子树大小是确定的,可以直接从这个点开始,由叶子节点向重心构造,每次找到当前点对应的父节点连边即可。最后对于重心节点,需要确保其距离和恰好为对应的 \(D_i\),这个一遍 DFS 即可。

由于 \(D_i \leq 10^{12}\),所以在找 \(v\) 的时候需要用到 set 或者离散化,时间复杂度是 \(\mathcal{O}(n \log n)\),瓶颈在于排序。

submission


CF1817E

tag:贪心、邻项交换、*3400

好题我懂得欣赏。

首先不失一般性令 \(A \gt B\),否则交换即可。

可以把 \(A,B\) 写成仅和 \(\{w_n\}\) 中元素选取方案及顺序有关的形式,也就是:

  • 将序列 \(\{w_n\}\) 划分为两个集合 \(S,T\),满足 \(|S| = k_1,|T| = k_2,k_1 + k_2 = n\);
  • \(A = \sum_{i\in S} w_{S_i} \times 2^{-d_i}\)。
  • \(B = \sum_{j\in T} w_{T_j} \times 2^{-d_j}\)。

进一步地,可以直接将 \(w\) 重排一遍之后得到类似于 \(u + v = n, A = (a_1 + a_2) \times 2^{1 - u} + \sum_{i = 3} ^ {u} \left(a_i \times 2^{2 - i}\right), B = (b_1 + b_2) \times 2^{1 - v} + \sum_{i = 3} ^ {v} \left(b_i \times 2^{2 - i}\right)\) 状物,所以实际上我们只需要确定一开始两个系数相同的位置该如何分配,剩下的 \(a_i \times 2^k\) 的形式因为 \(2^k\) 递减所以可以直接贪心。

简单贪心(邻项交换)可以发现 \(S\) 必定是集合的一个后缀而 \(T\) 必定是集合的一个前缀。假设这个前后缀的分界点在 \((p,p+1)\),那么实际上每个 \(i \in S, j \in T\) 对应的 \(d_i, d_j\) 已经确定了。因为 \(A\) 要尽可能大而 \(B\) 要尽可能小,所以第一次合并一定是选取前缀的最后两个元素和后缀的最前两个元素。也就是 \(d_p = p - 1, d_{p + 1} = n - p\),其余有 \(i \lt p\) 时 \(d_i = i\),\(i \gt p + 1\) 时 \(d_i = n - i + 1\)。

那么直接按照上述策略枚举分界点逐个 check 就得到了一个 \(\mathcal{O}(n^2)\) 做法。优化我们发现一般数据结构难以直接维护到单 \(\log\),但是因为每次 check 对应的贡献计算方式是相同的,所以可以考虑求出一次相邻移动的增量来代替逐个 check。也就是相邻贡献做差找到全局的 peak,求出差分序列 \(t\),有:

\[\Delta_{i,j} = \frac{t_j}{2^{n - j + 1}} -\frac{t_i}{2^{i-1}} - \sum_{k=i+1}^{j-1} t_k \times \left(2^{k-n-1} - 2^{1 - k} \right) \]

如果 \(j \leq \frac{n}{2}\),中间部分必定 \(\gt 0\),也就是只要一开始两项有 \(\frac{t_i}{2^{i-1}} \leq \frac{t_j}{2^{n-j+1}}\) 就一定满足 \(\Delta_{i,j} \gt 0\),而如果 \(j \neq \frac{n}{2} - 30\) 且 \(t_i \gt 0\),因为 \(t_i \leq 10^9\) 这个条件就一定满足,因此如果 \(i \leq \frac{n}{2} - 30\) 一定是越靠前越好,同理后半部分也是越靠后越好,所以只需要找到最前,最后各 \(30\) 个 \(b_i \neq 0\) 的位置来 check 即可。时间复杂度 \(\mathcal{O}(n \log V)\)。

submission


QOJ10485

tag:区间 DP,贪心。

首先看到连续区间操作,以及数据范围 \(n \leq 500\),考虑区间 DP。

假设一个区间 \([l,r]\) 可以用 \(k\) 次操作删空,那么它的收益就是 \(\frac{\left(\sum_{i=l}^{r} a_i\right) - k \times r}{d}\),要求上面那个东西能够整除于 \(d\)。

因此问题变成在确保整除的基础上,让 \(k\) 尽可能小。也就是我们需要求出对于区间 \([l,r]\) 最小的删空次数。

我们发现最小删空次数很难计算,问题相当于每次在分界点上合并 \(\mathcal{O}(d)\) 种可能的同余方程。但是 \(k\) 的上界很容易求出,并且这个上界至多是区间长度也就是 \(\mathcal{O}(n)\) 的,它等价于分段数 \(-1\),所以可以考虑维护出区间上界 \(g(l,r)\),然后枚举 \([0,g(l,r)]\) 中的删空次数求答案。

具体来说,\(g(l,r)\) 可以直接枚举分界点转移 \(g(l,r) = \max\limits_{l \leq p \lt r} \{g(l,p) + g(p+1, r)\}\),\(f(l,r)\) 同理。

还有一类转移就是整个区间没有删除,在上述转移对 \([l,r]\) 做完后枚举 \(t \in [1,g(l,r)]\) 然后看是否有 \(t\) 次对应的答案可以被 \(d\) 整除,如果满足条件就更新 \(f,g\) 即可。

这样枚举区间是 \(\mathcal{O}(n^2)\) 的,对每个区间第二类转移的上界至多是 \(\mathcal{O}(n)\),总时间复杂度 \(\mathcal{O}(n^3)\)。

submission


P12578

tag:构造、贪心、Ad-hoc。

首先对于 \(k\) 为奇数的情况,直接对整个矩形黑白染色,即 \(c_{i,j} = (i + j) \bmod 2\) 即可,这样每两个同色位置之间的距离均为偶数。

然后考虑偶数情况,考虑曼哈顿距离转切比雪夫距离,令 \(x_{i,j} = i + j, y_{i,j} = i - j\),那么问题转为对距离恰为 \(\max(x_{i,j}, y_{i,j})\) 对应的矩形边界上的位置,不能与当前位置同色。

因此问题重新变为 \(k\) 是奇数的情况,只是此时每条对角线的宽度不是 \(1\) 而是 \(k\),要确保的是同一个对角线内,满足 \(\text{dist}(\{i,j\},\{u,v\}) = \max(x_{i,j},y_{i,j})\) 的位置 \((i,j)\) 和位置 \((x,y)\)的颜色不同,容易注意到这样的位置对应的等价类至多只有 \(4\) 种,这种情形也只会在当前位置处于两条对角线的边界时取到。因此只需要让 \(\lfloor \frac{x_{i,j}}{k} \rfloor\) 和 \(\lfloor \frac{y_{i,j}}{k} \rfloor\) 作为染色的特征,即 \(c_{i,j} = 2\left( \left \lfloor \frac{i + j}{k} \right \rfloor \bmod 2 \right) + \left( \left \lfloor \frac{i - j}{k} \right \rfloor \bmod 2 \right)\),即可确保两个距离恰为 \(\max(x_{i,j},y_{i,j})\) 的位置的取值至少有一个二进制位是不同的。时间复杂度 \(\mathcal{O}(nm)\)。

submission


posted @ 2026-09-27 22:06  Twistedmind  阅读(11)  评论(0)    收藏  举报