CF 杂题
代码力量
感觉数数练差不多改练杂题了。
2026.7.1
Cube Snake
思路:3mins45s
2700 在于代码难度。
注意到可以用 \(k \times k \times (k + 1)\) 的矩形包含 \(2\) 个 \(k \times k \times k\) 的正方形,设这一段值域为 \([l, r]\),那么两头的 \(k \times k\) 的正方形值域显然为 \([l, l + k ^ 2 - 1]\) 和 \([r - k ^ 2 + 1. r]\)。然后中间可以出现一个 \((k - 1) \times (k - 1) \times k\) 的子长方体,分治即可。
代码不会写。嘴了。llj play
Tree Queries
AC:?
跨度为 1 天不好计时。
对于操作一假设点为 \(p\) 加了 \(d\),设其子树大小为 \(siz_p\) 点集为 \(sub(p)\),那么对 \(\forall x \not\in sub(p)\) 应有贡献 \(\frac{siz_p}{n} \times d\),对自己有贡献 \(d\),由于是单点查我们可以用树状数组维护。现在考虑计算对儿子的贡献,对于儿子集合 \(son(x)\),对于 \(\forall s \in son(x)\),对 \(\forall x \in sub(s)\) 有贡献 \(\frac{n - siz_s}{n} \times d\)。对每一个儿子的子树直接算会 T,我们不妨树剖,对于重儿子,我们将其子树对应的树状数组区间直接加上贡献;对于不是重儿子,可以在 \(p\) 上打标记,然后每次算答案跳重链算标记的贡献。做完了,具体细节看代码。
2026.7.2
Minimum Array
思路:41mins16s
AC:1h35mins48s
强势大炮打蚊子。
扫描线。对 \([1, n]\) 每个位置扫,用一个数据结构维护,第 \(i\) 个位置的值表示 \(i - 1\) 次操作后与原数组的变化量。由于要求字典序最小,将除开最小值的位置都删掉,\(1\) 到 \(n\) 扫一遍即可。由于要支持删位置和区间修改,用 fhqtreap 维护即可,具体细节看代码。做完了。
DZY Loves Strings
思路:9mins27s
AC:39mins47s
均摊舒服捏。
先预处理出每个长度在 \(4\) 以下的子串的位置,放在 vector 里。对于每一个询问,先判断是否无解,两个如果有一个不存在于串中即是无解。然后再判断是否包含,包含直接输出。然后对于其他情况,分别枚举两个串的结束位置,然后去二分最近的另一个串,利用这个方法求出最小长度,然后对询问记忆化即可。
这样子均摊 \(O(n \sqrt n \log n)\),最坏情况是 \(\sqrt n\) 个不同的 \(\sqrt n\) 长度的串。做完了。
K-Set Tree
思考:1h8mins
什么叫我拆了一堆贡献做不出来但是直接做就做完了???
2026.7.3
Arkady and a Nobody-men
思路:1mins18s
AC:30mins22s
草阿威罗赢了。
我们注意到对于一个点的答案只会有深度小于等于自己的点有贡献,于是我们可以从小到大枚举深度。每次枚举到一个深度 \(i\),枚举每一个点 \(x\),我们发现其答案就为其所有祖先的 \(siz\) 之和,\(siz\) 表示子树中深度小于等于 \(i\) 的点数。先枚举每个点将其所有祖先的 \(siz\) 给加 \(1\),然后再枚举一遍每个点算其所有祖先的 \(siz\) 之和记为 \(sum\),那么其答案就应为 \(sum - i\),因为要减去自身的贡献。我们发现这些操作用可以用树剖线段树维护做到 \(O(n \log ^ 2 n)\),做完了。
Converging Array (Easy Version)
思考:1h6mins52s
性质基本找完了但不会,为什么呢,可能是不是很擅长充要条件的计数吧。
这种题先观察性质:
- 选择了 \(i\) 位置操作后,\(a_i + a_{i + 1}\) 不变,直接算证明是简单的。
- 对于 \(a_{i + 1} - a_{i}\) 在收敛后应大于等于 \(b_{i}\),证明显然。
- \(\sum_{k = 1} ^ i a_k\) 单调不增,因为对于操作选择的位置为 \(p\),如果 \(p < i\) 那么和显然不变,若 \(p = i\) 减小或不变。
知道这三个其实就可以计数了。对于 \(\sum_{k = 1} ^ i a_k\),其显然有一个范围区间设为 \([l, r]\),由于性质 2 应有 \(l = \sum_{k = 1} ^ i (x + \sum_{j = 1} ^ {i - 1} b_j)\),题目可知 \(r = \sum_{k = 1} ^ i c_k\),那么和在这个区间内不管怎么选每个 \(a_i\) 最后都应是合法的,直接背包 dp 计数即可,答案就是 \(\sum_i dp_{n, i}\),做完了。
Two Arithmetic Progressions
思路:2mins25s
AC:23mins44s
这是什么难度。
用 exgcd 算出特解然后用不等式算一算范围即可。
Mahmoud and Ehab and yet another xor task
思考:1h
666 原来是线性基啊,之前对线性基的理解还是太浅了。
线性基。把询问离线下来,从小到大枚举 \(l\),设我们枚举到了 \(i\),那么就把 \(a_i\) 插入到线性基中。对于 \(l\) 为 \(i\) 的询问 \(x\),我们记 \(t\) 表示线性基中非 \(0\) 元素个数。首先判断是否有解,是简单的,设线性基中最高位为 \(k\) 的数为 \(c_k\),从高到低枚举位数 \(d\),若 \(x\) 最高位为 \(d\) 的话就 \(x \gets x \oplus c_d\),最后如果 \(x \ne 0\) 就无解。对于有解的情况,由于线性基的唯一性,随便取基外的元素,线性基内一定有一种取法使得亦或和为 \(x\),那么显然有方案数:
做完了。
2026.7.5
Red-Blue Matrix
思考:13mins8s
AC:1h15mins
哈希大法好。
首先对于 \(k\) 左边的数为蓝大于红很烦,我们把左边的数从 \(x\) 变成 \(10 ^ 6 + 1 - x\) 就变成和右边一样的了,都是所有红小于蓝。我们分开处理两边。
对于左边,枚举 \(k\),我们设 \(mn_i\) 表示第 \(i\) 行在 \(k\) 左边的最小值,\(mx_i\) 同理,于是我们枚举蓝色块中最小的值所在的行,即枚举 \(i\) 使得 \(mn_i\) 为蓝色块中最小值。如果其合法,那么要满足不存在 \(j\) 使得 \(mn_j < mn_i \le mx_j\),利用差分和树状数组可以判断。对于每一个 \(k\) 开一个布尔哈希表 \(vec\),并给每一行赋一个随机哈希值(在枚举之前)。对于每一个合法的 \(mn_i\),显然对于满足 \(mx_j < mn_i\) 的 \(j\) 都应被染成红色,把所有这样的行的哈希值亦或起来,假设为 \(h\),那么 \(vec_{k, h} \gets 1\)。
然后处理右边并输出。还是同理,设有 \(mn_i\) 和 \(mx_i\),第一维枚举 \(k\),枚举 \(mn_i\) 为蓝色块中最小,同样应满足不存在 \(j\) 使得 \(mn_j < mn_i \le mx_j\),并对合法的 \(mn_i\) 算出其哈希值 \(h\),如果 \(vec_{k, h} = 1\),那么显然就是合法的,输出即可。
做完了,时间复杂度 \(O(nm \log V)\),其中 \(V\) 为值域,具体细节看代码。
Permutation
思考:31mins31s
咕咕嘎嘎!
我们从小到大枚举 \(i\),为了方便表示设 \(x = a_i\)。我们在值域上,设 \(p_{a_{\forall j \le i}} = 1\), 其他都为 \(0\),如果不存在 \(x\) 为等差数列 \(3\) 个数中间的那个数,那么 \(p\) 应为以 \(x\) 为中心的回文串,用线段树加哈希维护即可。做完了,细节看代码。
2026.7.6
76767676767676
Serval and Music Game
思路:4mins13s
AC:1h17s
你是凑企鹅你是凑企鹅你是凑企鹅你是凑企鹅你是凑企鹅!你是谁啊?🐧🐧🐧🐧🐧🐧🐧🐧🐧
我们枚举 \(x\),设 \(a = \lfloor \frac{s_n}{x} \rfloor\),\(b = \lceil \frac{s_n}{x} \rceil\),那么我们注意到,对于 \(\forall k \in N ^ +\),对于 \(s_j \in [a \times k, b \times k]\) 都是有贡献的,那么我们开一个前缀和的桶来算区间有多少个 \(s_j\),然后直接枚举 \(k\) 做就做完了。注意当 \(a \times k \le b \times (k - 1) + 1\) 时出现了区间相交,那么对于区间 \([b \times (k - 1) + 1, s_n]\) 都应该是合法的了。虽说时间复杂度为 \(s_n \ln s_n\) 并且 \(s_n\) 是 \(10 ^ 7\) 级别,但还是跑得很快。
Editorial for Two
思路:6mins25s
AC:1h
卡常卡疯了。
首先注意到答案具有单调性,于是考虑二分答案,现在考虑 check 函数怎么写。假设我们二分到的答案为 \(mid\),我们可以枚举断点 \(i\),设左边最多有 \(a\) 个数的和小于等于 \(mid\),右边有 \(b\) 个数,那么如果存在 \(i\) 使得 \(a + b \ge k\) 那么说明 \(mid\) 是可行的。快速求 \(a\) 和 \(b\) 可以用主席树,时间复杂度为 \(O(n \log n \log V)\),其中 \(V\) 为 \(\sum_i a_i\) 的值域,只需卡亿点点常就过啦。
2026.7.8
78787878787878787878787878787878787878787878
Rowena Ravenclaw's Diadem
思考:13mins11s
AC:28mins50s
本质 1500。
首先给出简化版题意:给定一个边权为 \(0\) 或 \(1\) 的森林,每次询问:
- 对于类型 \(1\),判断 \(u\) 是否是 \(v\) 的祖先且 \((u, v)\) 之间的路径全为 \(0\)。
- 对于类型 \(2\),判断 \((u, v)\) 是否满足 \((u, lca(u,v))\) 的路径全 \(0\) 且 \((v, lca(u,v))\) 的路径全 \(1\)。
- 要注意自己不是自己的祖先,虽然 \(lca(u,v)\) 可能是 \(u\),并且对于路径 \(\forall x \rightarrow x\) 路径和为 \(0\)。
好了,你应该已经会了。利用前缀和和倍增,可以快速算出一个点到某个祖先的距离以及两个点的 lca,直接做即可。
Strange Sorting
AC:?
忘计时了qwqwqwqwqwq
倍增。对于每个询问,我们先模拟一遍对于一个 \(1\) 到 \(k\) 的子数组,经过一次变换之后到的位置,直接排序就可以得到。假设 \(u\) 经过一次变换后位置在 \(v\),设 \(nxt_{i, j}\) 表示 \(i\) 在经过 \(2 ^ j\) 次变换后在 \(1\) 到 \(k\) 中的位置,由于窗口一直在右移,应有 \(nxt_{u, 0} \gets v - 1\),对于 \(j > 0\) 的项倍增预处理即可。对于询问每一个点 \(i\) 经过变换后的位置,其第一次变换在子数组中的位置 \(p\) 应为 \(\min(i, k)\),那么其最多会被变换 \(mxt = n - k + 1 - (i - p)\) 次。我们假设变换 \(mxt\) 次后相对位置为 \(pos\),若 \(pos\) 不为零那么说明其确实经过了 \(mxt\) 此变换,则变换后的位置就应为 \(i - p + pos + mxt\);否则,其变换次数应小于 \(mxt\),倍增找到其变换次数 \(t\) 和最终位置 \(pos\) 满足 \(nxt_{pos, 0} = 1\),其变换后位置就应为 \(i - p + pos + t\)。
做完了,具体细节看代码。
Inverse Transformation
思考:53mins27s
asdfasdfasdf
LaZyTaG
Timofey and remoduling
AC:\(\infty\)
随机化与数据分治。
我们可以枚举首项 \(a_i\),设其为 \(x\),通过公式可以算出 \(d = \frac{\frac {2\sum_i a_i} n - 2x} {n - 1}\),那么多次随机取一个随机的 \(j \in [1, n)\),检查 \(a\) 中是否存在 \(x + j \times d\),没有就说明不是答案。这是一个十分优秀的随机策略,每个首项随机个一两千次就可以稳定的通过 54 个点,剩下的数据分治。做 完 了。
2026.7.21
long time no c;
Bottle Arrangement
思考:?
?!妙妙?!
考虑分治。对于区间 \([l, r]\),设最小值的位置为 \(i\),那么 \(b_n\) 有三种位置,于 \([l, i)\) 或 \((i, r]\) 或于 \(i\)。对于放在 \(i\),我们对于 \(b\) 从小到大排序,设前 \(k\) 个已经填完,若在 \(i\) 左边则将 \([i, r]\) 从大到小填满尽量小的数然后分治 \([l, i)\),另外一边同理。预处理笛卡尔树可以做到除了排序线性。
2026.7.22
后面都不记思考时间了,如果做出来了就写个 AC。
Modulo 3
没有想到线段树分治。
设 \(cnt\) 为缩点后的点数,方案数显然为 \(k ^ {cnt} \equiv k ^ {cnt \bmod 2} \pmod 3\),那么只需判断奇偶性即可。短边有点烦,用线段树分治可以避免。那么对于一直加边,我们可以用加权并查集维护强连通分量的个数的奇偶性,具体细节看代码。做完了。
Two Merged Sequences
逆天贪心。
设上升序列现在最后一个值为 \(x\) 下降最后一个为 \(y\),现在考虑 \(a_i\) 怎么填。对于 \(a_i \le x \land a_i \ge y\) 显然无解,对于 \(a_i > x\) 和 \(a_i < y\) 只满足一个也是简单的,那么对于二者都满足,我们考虑当 \(a_i < a_{i + 1}\) 时,令 \(x \gets a_i\) 显然是不劣的,否则就 \(y \gets a_i\)。对,做完了。
2026.7.24
Rock-Paper-Scissors Champion
AC
状态好拉,想题 10mins 调题 1h,应该是需要打塔了。
我们把剪刀石头布分别命名为 \(0\),\(1\),\(2\),对于 \(i\),显然其可以打败 \(i + 1 \bmod 3\),会被 \(i - 1 \bmod 3\) 打败,注意后文省略取模。我们在修改后分别算每一个的贡献,对于 \(i\) 的一个位置 \(p\),其左右两侧分别要么没有 \(i - 1\),要么既有 \(i + 1\) 和 \(i - 1\),\(p\) 才能构造出合法的胜利方案。这坨东西可以用平衡树维护,每次修改后对三个都算一下,具体细节看代码。做完了。
Deck-Building Game
困困困。
限制显然是选一个亦或和为 \(0\) 的集合再选一个子集,写成多项式就应为 \(\prod_{i = 1} ^ n (1 + 2 \times x ^ {a_i})\) 的常数项,其中卷积为异或卷积。这个直接 FWT 做显然不行,我们考虑 \(a\) 进行了 FWT 的数组 \(f\),有定义 \(f_i = \sum_j (-1) ^ {\text{popcount}(i \And j)} a_j\),那么对于原式贡献就只会有 \(-1\) 和 \(3\) 两种。我们设 \(FWT(\prod_{i = 1} ^ n (1 + 2 \times x ^ {a_i}))_i\) 有 \(x\) 个 \(-1\) 和 \(n - x\) 个 \(3\) 贡献那么值就应为 \((-1) ^ x \times 3 ^ {n - x}\),我们只需算出这个值然后 FWT 转回去即可。现在考虑怎么算贡献,对于 \((\sum FWT(1 + 2 \times 2 ^ {a_i}))_i = -x + 3 (n - x)\),前面那个是好求的,解出 \(x\) 之后算即可。
2026.7.25
Binary Matrix
AC
为什么是紫/yiw
维护连通块个数,直接考虑并查集,直接开开不下,滚动数组即可。一层一层枚举 \(i\) 边输入边合并,对于 \(i\) 不同的点要合并,设一个为第 \(x\) 层一个为 \(x - 1\),应将第 \(x - 1\) 层的父亲设为第 \(x\) 层的点,否则可能会出现重复的情况要出问题。做完了。
2026.7.27
Complete Mirror
AC
简单哈希题。
转化一下题意,不难看出提要求找出一个根,使得深度相等的点的子树同构。那么我们可以记 \(h_x\) 表示以 \(x\) 为根的子树的哈希值和 \(is_x\) 表示子树内是否每层的点的子树同构,这样能算出一个根的答案。我们注意到我们钦定的根不一定是答案,于是换根即可。换到点 \(x\) 时,设其为根,设儿子集合为 \(sub(x)\)。对于计算答案,开一个 map 统计每个合法哈希值出现次数,记为 \(buc\)。那么对于每一个 \(to \in sub(x)\),\(buc_{h_{to}} \gets buc_{h_{to}} + [is_{to}]\)。然后便利 \(buc\),设哈希值为 \(col\) 的合法子树有 \(cnt\) 个,如果存在 \(cnt = |sub(x)|\) 说明 \(x\) 可以做根,输出即可;如果出现 \(cnt = |sub(x)| - 1\),那么根应在那个唯一的 \(to \in sub(x) \land h_{to} \ne col\) 的子树中,继续递归换根即可。做完了。
2026.7.28
Monotone Monochrome Matrices (Hard Version)
真妙完了兄弟!
转化题目条件,发现 yes 时当且仅当每一列黑点形成的集合全部成包含关系。那么对于集合 \(a\) 和 \(b\) 包含当且仅当:
我们设 \(s_i\) 表示第 \(i\) 列的黑点点集。那么对于 \(\forall i < j\) 有 \(|s_i\cap s_j| = \min(|s_i|, |s_j|)\),求和就是:
两边都可以拆贡献算,直接 \(O(1)\) 维护即可。做完了。
2026.7.29
Majority
头好昏。
设 \(dp_{i, j}\) 表示钦定两边为 \(1\),操作到不能操作后最右边有 \(j\) 个连续的 \(1\) 的方案数,显然 \(dp_{1, 1} = 1\)。现在考虑转移。对于 \(i = j\),很好办,容斥:
接下来考虑 \(i \ne j\)。我们考虑在最右边有一个 \(dp_{j, j}\) 的左边添加 \(0\) 和 \(1\),有:
前缀和优化即可。做完了。
Sanae and Giant Robot
原来是 set 的简单应用。
转化以下条件,设 \(c_i = a_i - b_i\),\(sum_i = \sum_{j = 0} ^ i sum_j\),那么对于一个修改 \([l, r]\) 在当 \(sum_{l - 1} = sum_r = 0\) 时才能进行,操作就是将 \(j \in [l, r - 1]\) 进行 \(sum_j \gets 0\)。那么我们只需每次选出一对 \([l, r]\) 使得 \(sum_{l - 1} = sum_r = 0\),然后暴力修改中间 \(sum_i \ne 0\) 的 \(i\) 即可。我们用一个 set 来存哪些数的 \(sum\) 不为 \(0\),这样子一个一个删数是均摊 \(O(n \log n)\),每次修改区间时只需暴力 lower_bound 即可。做完了,具体细节看代码。
Cook and Porridge
AC
2500 的模拟题来了。
直接模拟即可。
2026.8.12
Narrower Passageway
AC
i think i nead a dopamine hit. everything that make me feel alive. i promise in the morning i'll quit. i just wanna know if i survive~
这种显然不是扫描线就是单调栈拆贡献,扫描线算不了,那么就把贡献拆到每个点。首先转计数,对于位置 \((i, j)\) 的点,我们求有多少种区间能将其包含,设 \(pre_{i, j}\) 是其上一个大于等于他的数的后一个位置,\(suf_{i, j}\) 是后一个比他大的数的前一个位置,那么其贡献的区间显然是 \([pre_{i, j}, suf_{i, j}]\) 的子区间。我们再找出两个点 \(lm\) 和 \(rm\),表示另一行中上一个和下一个比他大的,这两个二分 st 表是好求的,那么假设 \((i, j)\) 的贡献一个任意贡献区间为 \([l, r]\),那么 \(l \in [pre_{i, j}, lm] \land r \in [j, suf_{i, j}]\) 或 \(l \in [pre_{i, j}, j] \land r \in [rm, suf_{i, j}]\)。为了方便表示我们设 \(f(a, b, c, d)\) 表示 \(l \in [a, b] \land r \in [c, d]\) 的方案数,容斥,\((i, j)\) 贡献的区间数就应为 \(f(pre_{i, j}, lm, j, suf_{i, j}) + f(pre_{i, j}, j, rm, suf_{i, j}) - f(pre_{i, j}, lm, rm, suf_{i, j})\),对答案的贡献就是再乘一个 \(p_{i, j}\)。那么现在只需考虑算出 \(f(a, b, c, d)\) 即可,显然 \([b, c]\) 的状态都应没有雾,而 \([a - 1, b]\) 和 \([c, d + 1]\) 中一定存在一个点有雾,容斥快速幂计算起来是简单的。如果 \(a = 1\) 或 \(d = n\) 特判即可。做完了,细节见代码,注意代码中并没有封装 \(f(a, b, c, d)\) 函数。
Triple Attack
神了。
显然可以拆成奇偶两条链,每条链相邻两项差为 \(z\) 以上,两条链的头为 \(l\) 和 \(l + 1\) 是不劣的。对于固定点 \(i\),若只考虑一条链那么其下一个点是固定的,可以用倍增预处理,由于只有一个后继所以这是一个类似树的结构。但现在我们有两条链,虽然 \(i\) 和 \(i + 1\) 的后继一定为 \(\le\) 关系但还是会出现相等的情况,位置应为 \(i\) 和 \(i + 1\) 在后继树上的 lca,假设为点 \(x\),那么这时两个链此时的值应为 \(x\) 和 \(x + 1\) 是不劣的,再倍增预处理这个,每次算就先跳这个再跳后继树即可。做完了。
Inversions After Shuffle
AC
我们没有找到难度。好水。
把逆序对分两类,第一类为两者都在区间内,第二类为两者不都在区间内。对于每一个 \(i\),我们先算对于逆序对 \((j, i)\) 且 \(j \in [l, r] \land i \in [l, r]\)。由于是排列所以 \(\forall j\) 有 \(a_i \ne a_j\),那么在排列中会有 \(\frac 1 2\) 的概率变成逆序对,而两者都在区间的概率为 \(\frac {j \times (n - i + 1)} {\frac {n(n + 1)} {2}}\),那么这部分有贡献:
化简,有:
直接计算即可。对于第二类贡献,考虑 \(j\) 和 \(i\) 不都在排列中,那么相对位置不变,就要求 \(a_j > a_i\),那么有贡献:
其中 \(1 - \frac {j \times (n - i + 1)} {\frac {n(n + 1)} {2}}\) 为两者不都在区间内的概率。拆开,有:
树状数组维护即可。做完了。
Flip the Cards
神秘贪心。
要使最终牌堆有序,正面必须恰好为 \(1 \sim n\),背面为 \(n+1 \sim 2n\)。因此,若存在某张牌的两个数字同时 \(\le n\) 或同时 \(> n\),直接无解输出 \(-1\) 即可。对于每张牌,我们设 \(f_i\) 表示和 \(i\) 在卡片上对应的数,规定 \(i < f_i\),\(c_i\) 表示这张卡片使得 \(i\) 在正面是否需要反转即 \(i\) 是否不在正面。我们从小到大枚举 \(i\),若 \(\min_{j\in[1, i]} f_j = 2n - i + 1\),说明前缀 \([1, i]\) 中的 \(f\) 值均大于后续所有元素,该区间形成独立的连通块。我们设上一个连通块结尾为 \(lst\),那么新的联通块就应为 \((lst, i]\),我们考虑计算其贡献。我们考虑开两个栈,分别表示正序即 \(i\) 在证明与逆序 \(i\) 在背面栈并分别维护其贡献,设总贡献为 \(res\),枚举 \(j \in (lst, i]\),如果要将 \(j\) 放入正序栈有 \(res \gets res + c_j\),放入逆序栈有贡献 \(res \gets res + (1 - c_j)\)。现在考虑怎么放,显然栈中元素应越来越小,那么贪心的先放栈顶更小的栈不劣;如果两个栈栈顶都小于等于 \(f_j\) 那么无解。最后将答案加上 \(\max(res, i - lst - res)\),其中 \(i - lst - res\) 表示两个栈互换正序逆序的答案。一个连通块一个连通块算显然是均摊 \(O(n)\) 的,做完了。
2026.8.14
上午做 htoj t3 喜提 2h 没调出来,红红的温。
Tournament
AC
dp,抽象成树,设 \(dp_{i, j}\) 表示在第 \(j\) 层遇到了 \(i\),设朋友武力值为 \(s\),显然应有 \(i \ge 2 ^ (j + 1) - 1 + [i \ge s]\),转移显然,做完了。
Coloring
AC
我们把能染成一个颜色的点放在一个集合中,那么显然集合是固定的,且一个集合中的点要么一起染成一种颜色,要么全部染成不同颜色。我们暴力预处理出所有集合,设集合有 \(t\) 个,设 \(dp_{i, j}\) 表示第 \(i\) 个集合后需要的颜色个数,设第 \(i\) 个集合的大小为 \(sz_i\),对于 \(sz_i = 1\),有转移:
对于大于 \(1\) 的,按一起染色或分开染色有转移:
最后我们来算答案,枚举最后染成了 \(i\) 种颜色,分配颜色有方案数:
做完了。时间复杂度瓶颈在于暴力预处理集合。
Two Subarrays
AC
线段树暴力维护即可,类似区间最大字段和,不过这个麻烦点,维护的东西比较多。
Prefix Enlightenment
AC
显然一个灯最多存在于两个集合,因为任意三个集合的交一定是空集。对于一个集合中的点,一定会一起被按或不被按。我们一点一点从 \(1 \sim n\) 增加限制。假设枚举到了第 \(i\) 盏灯,如果其是关的且于两个集合中,那么这两个集合一定一个操作一个不操作;若 \(i\) 为开且于两个集合中,那么两个集合要么都不操作要么都操作;如果于一个中显然。我们发现这个过程可以用带权并查集维护,每个集合开 \(ans1_i\) 表示操作 \(i\) 会有多少个操作,\(ans2_i\) 表示不操作 \(i\) 会有多少个必须操作,\(fa_i\) 表示父亲 \(neg_i\) 表示是否于父亲不同,那么一个联通块的的贡献就应为 \(\min(ans1_i, ans2_i)\),若不能不开就将一个赋值为一个极大值,由于保证有解所以不可能两个都是极大值。每次修改的时候大分讨即可。做完了。
2026.8.18
Boxes and Balls
AC
显然不管怎么换球的顺序都不会改变,设进行操作前第 \(i\) 个的位置为 \(p_i\) 改变后为 \(q_i\),那么需花费操作次数 \(|p_i + q_i| + 2k\) 次其中 \(k \in Z ^ +\)。设 \(dp_{i, j, x}\) 前 \(i\) 个位置在改变后有 \(j\) 个球且最小需花费 \(x\) 费,答案就应为 \(dp_{n, cnt, k - 2x}\),其中 \(cnt\) 表示求个数 \(x\) 为任意正整数。对于转移,我们考虑暴力转移,显然有:
对于实现,我们滚动数组压掉第一维,二三维枚举卡一下枚举范围直接暴力 dp 是能过的。做完了。
2026.8.19
Expected diameter of a tree
AC
2026.9.1
Perun, Ult!
AC
简单贪心。
判断无穷解只是一些小细节直接带过。
对于每一段能打死的集合一样的时间区间,显然越晚越好。我们发现这样的区间最多只有 \(O(n)\) 级别。直接算即可。
The Number of Subpermutations
AC
mt19937 简单应用。
首先对于判断区间是否为排列,可以亦或哈希,由于区间长度确定那么只可能为一种排列,预处理出排列的哈希值和数组的前缀哈希直接比对即可。对于求答案,显然一个排列需要且只能包含一个 1,我们分两种情况,一是最大值在 \(1\) 的左边,我们枚举左端点 \(l\),那么最大值应为 \(mx = \max_{j = l} ^ i a_j\),那么区间长度也就只可能是 \(mx\),直接检查 \([l, l + mx - 1]\) 是否为排列即可;另一种最大值在右边同理,枚举右端点 \(r\) 求出 \([i, r]\) 最大值 \(mx\) 检查 \([r, r - mx + 1]\),由于是排列所以只会出现一个最大值,所以这样计数不会重复。做完了。
Stack Exterminable Arrays
想复杂了。
我们发现这东西类似括号序列,相同颜色的位置可以互相匹配,并且不难发现如果让尽量近的两个同颜色能匹配就匹配就可以涵盖所有情况,那么我们直接弄个栈匹配,记 \(i\) 作为右括号和 \(lst_i\) 匹配,设 \(dp_i\) 表示以 \(i\) 为结尾的答案,那么总答案显然为 \(\sum_{i = 1} ^ n dp_i\),对于转移,显然有:
直接转移算即可,代码用的 map 所以看着略有不同。做完了。
2026.9.2
Encryption (hard)
AC
显然可以 dp。设 \(dp_{i, j}\) 表示前 \(i\) 项分成 \(j\) 段的方案数,设 \(sum_i\) 表示前缀和,那么显然暴力转移有:
直接转移显然不行。我们注意到 \(p\) 只有 \(100\),那么我们可以预处理出所有 \(p\) 相同的 \(dp\) 值,即设 \(f_{j, k} = \min_{t < i \land sum_{t} \equiv k \pmod p} dp_{t, j - 1} - sum_t\),那么就变成了:
直接做是 \(O(Nkp)\),树状数组优化 \(f\) 做到 \(O(Nk \log p)\) 就能过了,有一些小细节就是对于 \(f_{j, k}\) 的 \(k\) 的范围应是 \([0, 2p)\),查询就查 \([0, p + (sum_i \bmod p)]\) 就行不用分讨,更新把 \(sum_i \bmod p\) 和 \(sum_i \bmod p + 1\) 都更新一下。做完了。
Escaping on Beaveractor
AC?
显然可以倍增,\(nxt_{i, j}\) 表示第 \(i\) 个箭头的下 \(2 ^ j\) 箭头的标号,显然再预处理一个和就可以做完了,所以现在只需要求出所有 \(nxt_{i, 0}\) 即可,扫描线线段树是简单的。做完了,Gemini 写代码。
Walking!
AC?
问题等价于,将 \(s\) 划分成尽可能少的 L,R 交替的非连续子序列。考虑贪心,每添加一个字符,就在前面划分好的子序列中找一个可以接到末尾的接进去,没有可以接的就新开一个子序列。最后要将若干个子序列拼接在一起,分类讨论一下即可。
2026.9.3
Divan and a Cottage
AC
完全没有难度的紫 *2600。
我们用一颗动态开点的线段树,每一个位置维护这个初始温度到现在会变成啥温度,显然这是单增的。那么对于一天,假设温度为 \(t\),我们线段树二分出区间 \([l, 10 ^ 9]\) 其温度全都大于 \(t\),区间减 \(1\) 即可,同理修改温度全部小于的区间 \([0, r]\),查询直接单点查。做完了。
Bear and Contribution
AC
首先显然,\(b \gets \min(b, 5c)\),这样一起走 5 步即点赞一定是比走 1 步的评论 5 次不劣的。我们考虑枚举这 \(k\) 个人相等的贡献值(称为基准),不难发现只有 \(t_{\forall i} + [0, 5)\) 是有用的,因为 \(t_i + 5\) 及以上一定比 \(t_i\) 更劣,个数是 \(O(n)\) 级别的,从低到高枚举即可。对于求答案,我们选择用堆维护,\(pq_i\) 表示基准值模 \(5\) 同余 \(i\) 的最小的 \(k\) 个点的集合,对于 \(i \ne 0\) 可以把所有数减去 \(i\) 就和 \(i = 0\) 时一样了,现在只需考虑 \(i = 0\) 即可。我们把每一个 \(t_i\) 表示为 \(5p - q\),那么对于当基准为 \(T = 5 s\) 时贡献为 \(b \times (s - p) + q \times c\),那么可以从小到大维护前 \(k\) 小的 \(-b \times p + q \times c\),用堆维护是简单的,每次枚举到一个 \(T\) 就把 \(t_i = T\) 的 \(i\) 加进去,如果堆大小大于 \(k\) 就弹出贡献最大的元素,再维护一个堆中元素之和 \(sum_i\),那么这个 \(T\) 答案就是 \(k \times s \times c + sum_i\)。做完了。

浙公网安备 33010602011771号