2025ACM训练日记
目录
- 2025ACM训练日记
- 2025 校科协算法组免试(4/5)
- ABC417(6/7)
- ABC416(5/7)
- ABC415(5/7)
- ABC414(5/7)
- ABC418(5/7)
- CF2131(Div.3)(6/8)
- 2024 CCPC 郑州邀请赛/河南省赛(10/13)
- 2024 ICPC 湖北省赛(10/12)
- 2024 ICPC 武汉邀请赛(8/13)
- CF2133(Div.2)(4/6)
- CF2104(Div.2)(5/7)
- 2024 ICPC 新疆省赛(8/10)
- CF2134(Div.2)(3/6)
- 2023 ICPC 网络赛(I)(6/12)
- 2024 CCPC 新疆省赛(7/10)
- 2024 ICPC 上海区域赛(4/13)
- 2023 ICPC 济南区域赛(3/13)
- 2023 ICPC 南京区域赛(4/13)
- CF2140(Div.2)(3/7)
- 2025 ICPC 网络赛(II)(1/12)
- CF2148(Div.4)(6/7)
- 2023 ICPC 沈阳区域赛(3/13)
- CF2143(Div.2)(4/7)
- 2023 CCPC 江苏省赛(5/12)
- 2025 CCPC 网络赛(3/13)
- CF2147(Div.1+2)(4/10)
- 2024 ICPC 沈阳区域赛(2/13)
- 2022 ICPC 沈阳区域赛(3/13)
- 2025 ICPC 台湾网络赛(5/12)
- 2025 ICPC North America Championship(1/13)
- 2024 ICPC 昆明区域赛(/13)
- CF2152(Div.1+2)(3/9)
- CF2155(Div.2)(3/6)
- CF2145(Div.2)(4/7)
2025ACM训练日记
2025 校科协算法组免试(4/5)
- A 不妨把题目分成两部分来考虑。前者,显然可以根据数据范围注意到 \(O(n^3)\) 的复杂度,那么考虑 Floyd 预处理,然后枚举可修复的边 \((u,v)\) 及其起点终点,也是 \(O(n^3)\) 。后者,考虑用并查集,不过不能路径压缩。
- B 注意到 \(10^{14}\) 的数据范围,考虑根号做法。那么区分 \(b\le\sqrt x\) 和 \(b\gt\sqrt x\) 两种情况讨论。前者直接枚举 \(b\) ,然后暴力计算数位和,复杂度 \(O(\sqrt x\log x)\) 可以接受。后者考虑 \(b^2>x\) 恒成立,那么 \(x\) 在 \(b\) 进制下至多有两位,不妨记为 \(d_1,d_0\) ,于是 \(x=d_1\cdot b+d_0,s=d_1+d_0\) ,转化为单变量解出 \(b\) 即可。特别地,需要注意一些 Corner Case。
- C 莫队二次离线板子,但我不会。 \(27\) 分做法是,考虑用树状数组统计逆序对, \(58\) 分做法是,考虑用莫队优化。
- D 很经典的小清新思维题。把不调整的时候的间隔全记录下来,依次考虑移动哪个区间。假如别处有个间隔够把它放进去,答案可以是当前这个区间移走后留下的那一片,也可以是别处间隔中最大的一个。值得注意的是,肯定可以移动一个区间使之与其左、右的区间相邻,从而创造出更大的间隔,相当于平移的滑动。
- E 动态规划。设 \(f_{i,e,c}\) 表示在处理完前 \(i\) 个事件后,精力为 \(e\) 和收集苹果数为 \(c\) 时的最早时间。我们不妨枚举前一步的 \(e,c\) 考虑其能到达哪里,直接模拟即可。另外,由于只和前一个事件有关,所以可以用滚动数组优化。
ABC417(6/7)
- C 注意到 \(i,j\) 可以分别移到等式两侧,然后二分搜一下是否有满足要求的即可。
- D 和免试的 E 有点类似。考虑从最后一个礼物开始向前处理,定义 \(f_{i,j}\) 表示处理完第 \(i\) 个到第 \(N\) 个礼物后,当前心情值为 \(j\) 时的最终心情值。我们可以框定一个心情值范围的上限 \(P_{max}\),在该范围内枚举计算。若初始心情值非常大,则尝试找出第一个小于 \(P_{max}\) 的位置,这里可以用前缀和来维护,显然前缀和是单调增的,可以二分。
- E 不难发现从起点每次选取可走的最小的节点,若最终到达终点,即是字典序最小的路径,那么直接这么走就行了。
- F 根据题意,维护一个可以区间赋值,区间查询的线段树即可,期望用费马小定理求逆元就好了。
ABC416(5/7)
- D 注意到答案相当于 \(\sum (a_i+b_i)-t\times m\) ,其中 \(t\) 是满足 \(a_i+b_i\ge m\) 的数量。那么将两个数组排序,双指针贪心地找,从大到小地枚举 \(a_i\) ,同时固定 \(b_j\) 从小到大地移动指针 \(j\) 即可。
- E 感觉是免试 A 的略微升级版。这里值得注意的是多了一些“机场”的特殊点,那么不妨建一个虚点,由所有机场指向虚点的单向边权值均为 \(t\) ,由虚点指向所有机场的单向边权值均为 \(0\) ,于是把操作二中新建机场的操作也转化为了新增边的操作。
ABC415(5/7)
- C 状压dp。设 \(f_i\) 表示状态 \(i\) 是否可达,按题意逐步转移即可。
- D 贪心。记 \(d_i=A_i-B_i\) ,考虑到每次交换会损失 \(d_i\) 个瓶子,所以贪心策略是按照 \(d_i\) 降序排序。而每次可以换 \((\left \lfloor \frac{n - A_i}{d_i} \right \rfloor +1)\) 次 。该公式是这样计算得出的:当我们有 \(n\) 个空瓶时,假设至多可以换 \(k\) 次,那么我们需要确保在进行第 \(j(1\le j\le k)\) 次交换之前,拥有的空瓶数足够支付 \(A_i\) 。由于空瓶数量递减,所以我们只需要保证它对最大的 \(j=k\) 成立即可,也就要有 \(n−(k−1)⋅d_i\ge A_i\) ,整理即得上式。
- E 或许难点在于怎么存这个 \(H\times W\) 的图。根据题意显然可以二分,但更优的做法是直接 dp,这样少一个 \(\log\) 。由于不好从 \((1,1)\) 走向 \((h,w)\) ,那么不妨倒着考虑。从 \((h,w)\) 走向 \((i,j)\) 时,设 \(f_{i,j}\) 表示需要的最少初始硬币数,这样状态设计是无后效性的。
ABC414(5/7)
- C 有点意思。 \(10^{12}\) 的数据范围肯定不能直接枚举,但这里要求的是回文,那么我们不妨枚举回文的前半,也就是 \(10^6\) 的范围,这是可以接受的。举个例子,对于 \(123\) ,其能生成奇数长度回文 \(12321\) ,也可以生成偶数长度回文 \(123321\) ,我们只需对生成的回文判断是否超过 \(n\) ,且进制转换时其是否是回文即可,进制转换的复杂度是 \(\log\) 级别的。因为可以直接用 \(to\_string\) 、 \(stoll\) 这类函数,实现上还是很简单的。
- D 我们考虑基站位置的选择,由于可以任选一个实数,所以我们期望一个基站就能覆盖若干栋房子。于是,问题可以转化为把 \(n\) 栋房子分为 \(m\) 个连续组,每组对应一个基站。显然,基站之间有 \(m-1\) 个间隔,而房子之间一共有 \(n-1\) 个间隔,于是我们只需要在 \(n-1\) 个间隔里挑选最大的 \(m-1\) 个间隔,即可最小化代价。
- E 整除分块板子。首先注意到数据范围是 \(10^{12}\) ,考虑根号做法,当然此时还是比较盲目的,我们不妨先推式子。显然,对一组确定的 \((a,b)\) 而言, \(c\) 也随之被确定了。由于这里是取模运算,那么我们不妨考虑 \(a,b\) 的大小关系。因为 \(1\le a,b,c\le N\) ,所以必然有 \(b\nmid a\) ,即 \(c\neq 0\)。此外,因为 \(a,b,c\) 互不相等,所以必然有 \(a>b\) ,即 \(a\neq c\) 。于是,我们可以先锚定 \(a\) ,(事实上 \(a\neq1\) ,但我们从 \(a=1\) 开始枚举没有问题)考虑可能的 \(b\) 的数量,故答案即:\(\sum\limits_{a=1}^n\sum\limits_{b=1}^{a-1}[b\nmid a]=\sum\limits_{a=1}^n(a-1-\sum\limits_{b=1}^{a-1}[b\mid a])=\sum\limits_{a=1}^n(a-\sum\limits_{b=1}^{a}[b\mid a])=\sum\limits_{a=1}^na-\sum\limits_{a=1}^n\sum\limits_{b=1}^{a}[b\mid a]=\frac{n(n+1)}{2}-\sum\limits_{b=1}^n\left \lfloor \frac{n}{b} \right \rfloor\) 。
ABC418(5/7)
- D 同或,注意到一个字符串是美丽的当且仅当其中 \(0\) 的数量是偶数。于是,问题转化为:给定字符串,计算其所有子字符串中 \(0\) 的数量为偶数的子字符串的数量。考虑前缀和,记 \(pre_i\) 表示前 \(1..i\) 位中 \(0\) 的数量,我们需要 \(pre_r - pre_{l-1}\) 为偶数,即 \(pre_r\) 和 \(pre_{l-1}\) 同奇偶性。
- E 在本题中,梯形是至少有一对边平行的四边形。那么,我们可以算一对平行边可构成四边形的数量,再减去平行四边形的数量,因为平行四边形有两对平行边会多产生一次贡献。前者考虑计算所有点对的斜率,斜率相同即平行。后者考虑平行四边形的中心平分两条对角线,通过记录中点的坐标计算。在计算斜率时,可以用 \(\gcd\) 约分,但请用
gcd,而非__gcd。
CF2131(Div.3)(6/8)
- D 注意到最终肯定是菊花图,即直径为 \(2\) 。根据每次操作的性质,我们会使得路径上的所有点与起点相连。于是,我们需要定出菊花图的花心,不难发现,花心应该为与叶子结点距离为 \(1\) 的点。我们考虑每次操作都可以减少一个叶子,那么答案就是总叶子数减离花心距离为 \(1\) 的叶子数。前者是定值,我们只需统计后者的最大值即可。
- E 注意到题目限制每个操作最多执行一次。于是,从前往后遍历时,如果需要操作必然要操作,因为 \(a_{i+1}\) 改变了以后就不能再给 \(a_i\) 赋值了。然后再从后往前遍历,此时我们要判断,若需要操作则进行操作,由于是从后往前,所以可以保证 \(a_{i+1}=b_{i+1}\) 。两次遍历即可解决。
- F 注意到对于每个 \((x,y)\) ,其路径上的所有 \((i,j)\) 都得满足 \(a_i = b_j\) 。这实际上意味着,对于路径上的所有行 \(i\) 和列 \(j\) ,\(a_i\) 和 \(b_j\) 必须相同。即,我们令路径上的所有 \((i,j)\) 都有 \(a_i = b_j = c\) , \(c\) 仅有 \(0/1\) 的两种可能。于是,我们可以先选定 \(c\) 的值,然后翻转路径上不一致的值,取操作次数较少的方案。大致思路如上,我们考虑做法。记 \(A_x/C_x\) 表示 \(a\) 的前 \(x\) 位中 \(1/0\) 的数量, \(B_y/D_y\) 表示 \(b\) 的前 \(y\) 位中 \(1/0\) 的数量,故 \(f(x,y)=\min(A_x+B_y,C_x+D_y)\) 。我们假定 \(A_x+B_y\le C_x+D_y\) ,将 \(x,y\) 分离至不等号两边,即 \(A_x−C_x\le D_y−B_y\) 。记 \(val_x = A_x - C_x\) , \(val_y = D_y - B_y\) ,我们假定的条件就变为了 \(val_x\le val_y\) 。由于对于每个 \(y\) 而言, \(val_y = D_y - B_y\) 是一个固定的值,与 \(x\) 无关。因此,我们可以预先计算所有 \(val_y\) 并排序,于是在枚举 \(x\) 时,我们可以二分查找所有满足 \(val_y \ge val_x\) 的 \(y\) 。当 \(val_y \ge val_x\) 时,这部分 \(y\) 的贡献是 \(A_x + B_y\) ;当 \(val_y < val_x\) 时,这部分 \(y\) 的贡献是 \(C_x + D_y\) 。为了简便计算,我们可以记录每个 \(val_y\) 对应的 \(B_y\) 和 \(D_y\) ,并在排序后计算前缀和,这可以确保在计算区间和时仍然正确。时间复杂度为 \(O(n\log n)\) 。
2024 CCPC 郑州邀请赛/河南省赛(10/13)
- J 签到题。注意输出不能有前导 \(0\) 。
- B 注意地雷在每一轮中可以购买任意次。观察到数据范围,需要 \(O(n)\) 或 \(O(n\log n)\) 的做法。前者,有单调栈的做法,维护一个严格递增的轮次序列,确保每次选择的是当前最优的购买轮次,即花费最少的扫雷币,最后遍历单调栈,计算每轮最多可购买的探测器数量。后者,有反悔贪心的做法,用大根堆存储已购买的探测器信息 \((c_i,cnt)\) , \(c_i\) 是花费,\(cnt\) 是购买数量,每次动态调整买更便宜的。当然,这里的两种做法没有本质区别。
- F 签到题。
- M 签到题。显然要二分 \(k\) ,也就可以算出每个 \(x_i\) 的取值范围了,当且仅当这 \(n\) 个取值范围区间有交时合法。
- H 首先要注意到,我每次只能取出最小值,那么直接算概率即可。我们可以动态维护一个单增的序列,每次取最小值,然后概率就是其数量除以序列的长度,另外要维护一个已取出的最大值。用
multiset会超时 ,因为极限状态下复杂度会是 \(O(n^2)\) ,但用priority_queue和map的话,复杂度是 \(O(n\log n)\) 的,可以接受。本题还有 \(O(n)\) 做法,由于 \(-1\le a_i\le n\) ,所以我们可以计数排序 \(O(n)\) 地得出需要的操作序列,同时直接用数组来计数,并且由于序列长度 \(\le n\) ,所以先线性地预处理出逆元即可。 - L 显然每次运行一定会在某个有 bug 的行。设 \(f_i\) 表示 debug 前 \(i\) 行所需的最小时间,那么我们有转移方程: \(f_i = \min\limits_{1≤j≤i}(f_j+a_i+(i-j)^4)\) ,若直接枚举是 \(O(n^2)\) 的,不可接受。但我们注意到 \(i-j\) 越大,其作为答案的可能越小,换言之,我们只需要考虑 \(i-j\le 500\) 的部分即可。此时最多枚举 \(10^8\) 次,完全可以通过。当然,也可以将常数替换为 \((i-j)^4\le f_i\) ,无伤大雅。官方标算的复杂度是 \(O(n^{\frac{5}{4}})\) ,所以我们的枚举到 \(500\) 已经绰绰有余了。
- K 注意到,我们可以人为地给边定向,若 \(a_u\ge \frac{a_v}{2}\) ,则令 \(u\to v\) 。于是,我们可以得到树形的有向图,此时要统计的是,有多少个点满足其他所有点均可到达它。不难发现双向边不会对结果产生影响,但有向边会,我们可以对该有向图缩点来获取 DAG 。注意到如果则在该 DAG 中仅存在一个点出度为 \(0\) ,则该点所属的强连通分量的大小即为答案。因为若没有点出度为 \(0\) ,则不是 DAG ,若有多个点出度为 \(0\) ,则这些点无法相互到达,不合题意。考虑怎么缩点,可以直接用 Tarjan 缩点,而因为本题中不需要其他的操作了,所以也可以用并查集缩点。除了缩点的做法以外,本题也可以用换根 dp 做,是很经典的内外部关系的题。
- A 构造,考虑令幸运数的前 \(10\) 位是 \(\overline{123456789d}\) 。记 \(N=(1234567890+d)\times 10^{\left \lceil \log_{10}n \right \rceil }\) ,因为 \(N\) 的位数远多于 \(n\) ,且 \(10^{\left \lceil \log_{10}n \right \rceil }\) 是比 \(n\) 大的最小的 \(10\) 的幂次,所以 \(k = \left \lceil \frac{N}{n} \right \rceil\) 的高位主要由 \(N\) 的高位决定。严谨地说, \(\left \lceil \frac{N}{n} \right \rceil\le 2\times10^9\times\frac{10^{\left \lceil \log_{10}n \right \rceil }}{n}\le2\times10^{10}\) ,并且 \(\left \lceil \frac{N}{n} \right \rceil\) 的前 \(10\) 位与 \(N\) 相同,因此取 \(k = \left \lceil \frac{N}{n} \right \rceil\) 即可。
- D 不妨取点 \(P,Q\) 画张图看一下 \(\frac{\left \| PQ \right \| _1}{\left \| PQ \right \| _2}\) ,就能发现如果我们记 \(|\frac{y_P-y_Q}{x_P-x_Q}|=\tan \theta\) ,其中 \(\theta \in \left[0, \frac{\pi}{2}\right]\) ,则有 \(\frac{\|PQ\|_1}{\|PQ\|_2} = \cos \theta + \sin \theta = \sqrt{2} \sin\left(\theta + \frac{\pi}{4}\right)\) 。显然,当且仅当 \(\theta=\frac{\pi}{4}\) 时,即点 \(P,Q\) 在直线 \(y=x\) 或 \(y=-x\) 上时取最大值。换言之, \(PQ\) 与 \(x\) 轴夹角越接近 \(45^{\circ}\) 或 \(135^{\circ}\) 时, \(\frac{\left \| PQ \right \| _1}{\left \| PQ \right \| _2}\) 越大。先考虑前者,我们不妨将整个坐标系关于原点逆时针旋转 \(45^{\circ}\) ,此时直线越贴近 \(y\) 轴,值就越大。注意到:最大值只会出现在横坐标相邻的点对上。这可以用反证法,取三个横坐标按顺序排列的点 \(A,B,C\) 证明。因此我们按横坐标排序后遍历算一遍相邻点的答案,取最大值即可。不过注意我们排序是按旋转后的横坐标 \(x'=\frac{x-y}{\sqrt2}\) 排序,但是计算时用的还是原坐标。类似地,逆时针旋转 \(135^{\circ}\) 时,按照 \(x'=\frac{x+y}{-\sqrt2}\) 排序。最终两次遍历取最大值即可,时间复杂度 \(O(n\log n)\) 。
- C 很牛的一道题。首先注意到,如果序列 \(A\) 中存在两个相等的数字,那么两个数字中间的所有数字映射后必须是相等的。证明: \(A\) 中有两个相同的数字 \(x\) ,分别出现在位置 \(i\) 和 \(j\) \((i < j)\) ,即 \(A = [..., x, ..., x, ...]\) ,那么,在单调不降的序列 \(B\) 中,这两个 \(x\) 对应的值必须满足: \(B_i = f(x) ≤ B_{i+1} ≤ ... ≤ B_j = f(x)\) ,故只能同取等号。我们称“块”指:一段区间 \([L, R]\) ,其中所有数字在 \(B\) 中必须相同。若“块”与“块”之间有交,那么我们要将之合并为一个更大的“块”。现在问题变为,为每一个“块”选择一个数字赋值,使得最终序列单调不降且改变的数字个数最小。注意代价的定义是: \(f(x) ≠ x\) 的 \(x\) 的个数,这是指有多少个不同的数字被修改了,而不是修改了多少次。我们考虑怎么计算“块”的代价,设一个“块”内有 \(x\) 个不同的数字:选在“块”内部的值,则代价为 \(x-1\) ;选在“块”外部的值,则代价为 \(x\) 。因此,要使代价最小,等价于在每个“块”中挑选一些数字,让这些数字不变且这些数字单调递增,这是最长上升子序列问题。我们可以将所有“块”内的数字降序排序,然后再求一次 LIS ,求得的答案就是最多的不变个数。因为 LIS 选择出来的那些数字实际上是决定每个“块”最终的数字,又由于每个“块”内降序排序,所以每个“块”内只会选择至多一个数字,LIS 得到的方案是和实际变化的方案一一映射的。具体实现上,我们记 \(l_x,r_x\) 分别表示 \(x\) 的第一次与最后一次的出现位置,用差分数组求前缀和来标记所有数字对应的区间范围,值得注意的是, \(d_{l_x}++,d_{r_x}--\) ,在求前缀和后,若遇到 \(d_i = 0\) ,则说明这是一个区间边界。
2024 ICPC 湖北省赛(10/12)
- E 签到题。
- A 签到题。显然 \(a=1\) 。
- J 签到题。注意到答案就是平均数。
- B 签到题。注意到肯定选一个三角形, \(O(n^3)\) 枚举即可。
- L 分类讨论题。罚时吃满。若 \(a=b\) ,则代价为 \(0\) 。不妨令 \(a<b\) ,若 \(b\) 是 \(a\) 的倍数,则 \(a\to b\) ,代价为 \(b\) ;若 \(a,b\) 不互质,则 \(a\to\gcd(a,b)\to b\) ,代价为 \(a+b\) ;若 \(a,b\) 互质,则考虑构建以 \(a,b,2\) , \(a\) 的最小质因子, \(b\) 的最小质因子为节点,以两点间 \(\text{lcm}\) 为边权的完全图, 用 Floyd 暴力算 \(a\) 到 \(b\) 的最短路即可。最小质因子可以用欧拉筛线性地预处理出来。
- H 注意到 \(k\) 和 \(a_i\) 很小,考虑四进制状压 dp 。记 \(S\) 是一个长度为 \(k\) 的四进制数,每一位表示该格子还需要被炸弹覆盖的次数, \(f_S\) 表示满足需求状态 \(S\) 所需的最小炸弹数。显然,炸弹的候选位置仅在有鱼格子的本身位置和其上下左右相邻位置。我们可以用二进制数 \(mask\) 预处理出每个炸弹会影响哪些有鱼格子。于是,我们枚举 \(S\) ,再枚举炸弹的候选位置暴力更新即可,答案为 \(f_0\) 。
- G 模拟围棋的都来了。考虑每次落子后直接 bfs 枚举邻格的异色子的联通块,然后枚举自己的联通快,检查是否要提子。记 \(s=19\) ,这样的做法是 \(O(s^2m)\) 的,尽量避免
set这类容易超时的数据结构。如果只允许 \(O(m α(m))\) 的复杂度,那么要用并查集维护连通性与气,暴力删棋子,这么写要注意的细节很多。 - K 由于期望具有线性性质,最终结果的期望可以分解为每个原始数乘以各自贡献系数的和: \(\mathbb{E} = \sum\limits_{i=1}^{n} f_i \cdot a_i\) ,其中 \(f_i\) 表示第 \(i\) 个原始数 \(a_i\) 对最终结果的贡献系数。计 \(f_{i,j}\) 表示左边有 \(i\) 个数,右边有 \(j\) 个数时的贡献系数。有: \(f_{i,j} = \frac{1}{i+j} \left[ (i-1)f_{i-1,j} + (j-1)f_{i,j-1} + \frac{1}{2}f_{i-1,j} + \frac{1}{2}f_{i,j-1} \right]= \frac{1}{i+j} \left[ (i - \frac{1}{2})f_{i-1,j} + (j - \frac{1}{2})f_{i,j-1} \right]\) 。注意到,如果令 \(g_{i,j} = (i+j)! \cdot f_{i,j}\),则原递推式变为: \(g_{i,j} = (i - \frac{1}{2})g_{i-1,j} + (j - \frac{1}{2})g_{i,j-1}\) 。把 \(g_{i,j}\) 看成网格图,那么问题实质上就转换为带权路径计数问题。首先,路径总数为: \(\binom{i+j}{i}\) ,其次,每条路径的权重为其经过所有边权重的乘积。注意到所有从 \((0,0)\) 到 \((i,j)\) 的路径具有相同的权重,因为无论路径顺序如何,每个横、纵坐标必然被经过一次,因此单条路径权重为: \(\prod\limits_{k=1}^{i} (k - \frac{1}{2}) \cdot \prod\limits_{l=1}^{j} (l - \frac{1}{2})\) 。故, \(g_{i,j} = \binom{i+j}{i} \cdot \prod\limits_{k=1}^{i} (k - \frac{1}{2}) \cdot \prod\limits_{l=1}^{j} (l - \frac{1}{2})\) 。
- F 主席树。首先,注意到合并书本的过程等价于一个二进制加法,一本权值为 \(k\) 的书的权值是 \(2^k\) ,最终合并的书的等级就是所有权值加和后值为 \(1\) 位置的位数。由这个过程不难发现,合并的结果是唯一确定的。因此,操作 \(1\) 就是区间求和后找和值的最高位;操作 \(2\) 就是区间求和后找和值中第 \(k\) 位往上数的连续位数。都只需要求得区间和,即可轻松解决。对于操作 \(3\) 的修改和操作 \(4\) 的回退操作,我们使用可持久化线段树来维护。
- I 首先,对于这棵树,我们可以预处理出每个点第一次被染成黑色的时间。具体来说,我们使用树链剖分,给每个点维护第一次被染成黑色的时间作为点权,初始全部为极大值。每次操作等价于区间取 \(\min\) ,懒标记线段树即可。然后,考虑离线处理,将节点按首次变黑时间排序,创建事件列表。我们正序处理黑色森林,逐步加入变黑节点,用并查集维护黑色连通块及其直径。因为并查集本身处理了连通性,所以对于每个被加入的点 \(u\) ,我们只需检查它的所有邻居是否可以联通,这保证了线性的复杂度。于是问题转化为:进行一些连边,动态维护直径。这时候我们需要用到一个经典结论:给定两个点集 \(S,T\) ,其中 \(S\) 的一条直径的两个端点是 \((x,y)\) , \(T\) 的一条直径的两个端点是 \((u,v)\) ,则最后直径的两个端点一定在 \((x,y,u,v)\) 中四选二产生。故,我们用并查集森林的父节点、大小、最大直径、各联通块直径端点。特别注意,合并两个连通块后,新直径可能比原来记录的最大直径小,所以最大直径要维护历史最大值。类似地,我们再时光倒流,逆序处理白色森林,逐步加入白色节点,维护白色连通块及其直径。答案显然为,两者之间的最大值。时间复杂度 \(O(n\log^2 n)\) 。
2024 ICPC 武汉邀请赛(8/13)
- I 签到题。
- K 签到题。 \(\oplus_{i=1}^{n}i\) 是一个经典结论,其值和模 \(4\) 相关。本题而言,手玩一下数据就能发现规律了。
- B 注意到给出的操作次数可以做到任意分配,我们算出数组 \(a\) 所有元素的和 \(sum\) ,可以将题意转化成把 \(sum\) 分配给 \(n\) 个位置,使得所有位置的数的或最小。考虑从最高位向最低位贪心,假设当前位是第 \(bit\) 位,显然如果当前位不放数字时仍能够将剩余的 \(sum\) 分配给后续位,则显然不在这一位放数字。否则,考虑在这一位放置多少数字合适,令最多能在这一位放置 \(x\) 个数,显然 \(x=\min(n,\left \lfloor \frac{sum}{2^{bit}} \right \rfloor)\) 。
- F 交互题。由于方阵有行列均非降的优良性质,我们不难想到二分。这里第 \(k\) 大的值是满足大于 \(x\) 的元素个数 \(< k\) 的最小 \(x\) 。而由于每行从左到右非递减,对于固定行 \(i\) ,列 \(j\) 从右往左移动时,值逐渐减小,所以我们可以找到第一个满足 \(a_{i,j} ≤ x\) 的位置 \(j\) ,该行大于 \(x\) 的元素有 \(n - j\) 个。这里的处理是从右上角一直走向左下角的过程,实际上也是双指针, \(j\) 只会递减不会递增,这确保了总复杂度是 \(O(n\log n)\) 的。
- D 有趣。首先,不难注意到最佳路径至多折返一次。我们不妨先考虑不折返时的答案,因为是单向通行所以用前缀和维护即可,我们取当前状态下向左/右走的最大值为 \(F_{i,j}\) 的初始值。然后,我们考虑可能折返的情况,不妨枚举时间 \(j\) ,有递推式: \(F_{i,j}=\max(F_{i+1,j-1},F_{i-1,j-1})\) 。这个式子看上去有点神秘,因为我们不能知晓在什么地方折返,折返了几次等信息。但何必去想前一个状态是不是真的折返了,又是不是折返了一次呢,我们不需要关心前一个状态的具体路径,只需要知道它是最优解。实际上,即使它有这样的规律,在转移也不会体现出来。以 \(f_{i + 1,j - 1}\) 为例,这表示:先从 \(i\) 向右走到 \(i+1\) ,然后在 \(i+1\) 用剩下的 \(j-1\) 秒执行最优策略。 dp 本身已经保证了正确性,尽管很神秘,但显然这样的写法是最简洁的。当然,官方题解提供了一种易于理解的写法。记 \(g_{i,j}\) 表示从位置 \(i\) 出发,移动不超过 \(j\) 次,且不改变移动方向时经过格子上数的和的最大值。于是, \(F_{s,t} = \max\left\{ g_{s,t},\ \max_{x \neq s} \{ g_{x,t-|x-s|} \} \right\}\) ,前者指不改变移动方向的走法,后者指改变移动方向恰好一次的走法,且在 \(x\) 折返。故,我们只需求 \(F_{s,t} = \max\left\{ g_{s,t},\ g_{s+1,t-1},\ g_{s+2,t-2},\ \ldots,\ g_{s-1,t-1},\ g_{s-2,t-2},\ \ldots \right\}\) ,这是一个前后缀最大值形式的递推,在预处理出 \(g\) 后可以 \(O(n^2)\) 得到 \(F\) 。
- E 和上一场的 I 很类似,甚至说是弱化版。首先注意到,对于每个可能是答案的 \(t\) ,选择子树 \(V(r, t)\) 的直径中点作为 \(r^′\) 一定是最优的。因此考虑维护每个时刻的树直径。可以观察到,如果当前树的直径端点是 \((u, v)\) ,新加入一个节点 \(x\) 后,新直径端点一定是 \((u, v),(u, x),(v, x)\) 三者其一,我们只需要维护任意一个可以处理树上节点之间距离的算法即可。维护树直径之后,观察到 \(k\) 变大时,\(t\) 不会变大,因此可以用双指针处理出答案。复杂度是 \(O(n \log n)\) 。
- M 挺有趣的一道题。注意到每次操作都需要一个偶数和一个奇数并产生一个奇数,故可能合并产生的最大数为 \(2x + 1\) 或 \(2x − 1\) ,其中 \(x\) 为当前序列中的最大偶数。我们只需要不断判断是否能够得到 \(2x + 1\) 或 \(2x − 1\) ,并将相应数合并即可。具体地,我们判断数 \(x\) 是否可以获得的方法是,若 \(x\) 已经在当前序列里,那么可行;若 \(x\) 不在当前序列里,若 \(x\) 是奇数,则需判断 \(\frac{x+1}{2}\) 和 \(\frac{x-1}{2}\) 是否可获得;若 \(x\) 是偶数,则必然不可能被获得。于是,我们可以递归地判断,由于每次都会除 \(2\) ,所以是 \(O(log x)\) 的时间复杂度。我们不妨用哈希表维护各个数的出现次数,可以以 \(O(n log V)\) 的时间复杂度解决本题,这里 \(V\) 是 \(a_i\) 的值域。
- G 数学好题。假设一种包装方案为 \(x\) 个 A 物品和 \(y\) 个 B 物品,那么必然满足 \(a \cdot x + b \cdot y = k\) 的限制。由裴蜀定理知: \(a \cdot x + b \cdot y = \gcd(a, b)\) 。那么如果 $ \gcd(a,b)\nmid k$ ,这一限制无整数解,即在本题中无解。记最多能包装的商品数量为 \(t = \min(\lfloor \frac{n}{x} \rfloor, \lfloor \frac{m}{y} \rfloor)\) ,则剩余物品数量为 \(n + m - t \cdot (x + y)\) 。因此,我们需要最大化:\(t \cdot (x + y)\) 。我们不妨先用 exgcd 求出特解 \((x_0,y_0)\) ,特别地,我们不妨令 \(x_0\) 是最小非负整数解,那么此时 \(y_0\) 是对应的最大解。于是,通解 \((x,y)\) 即 \(x = x_0 \cdot \frac{k}{g} + t \cdot \frac{b}{g},y = y_0 \cdot \frac{k}{g} - t \cdot \frac{a}{g}\) ,其中 \(g = \gcd(a, b)\) , \(t\) 为正整数参数。为简化式子,我们记 \(x_0'=x_0 \cdot \frac{k}{g},y_0'= y_0 \cdot \frac{k}{g},dx=\frac{b}{g},dy=\frac{a}{g}\) 。于是 \(x=x_0'+t\cdot dx,y=y_0'-t\cdot dy\)。显然,依旧要满足 \(x\ge0,y\ge0\) 的条件,故 \(t\le \lfloor \frac{y_0'}{dy} \rfloor\) 。然后如何考虑在 \(10^9\) 的数据范围下通过本题,注意到 \(\min(\lfloor \frac{n}{x} \rfloor, \lfloor \frac{m}{y} \rfloor)\) 可以整除分块。不妨令 \(\lfloor \frac{n}{x} \rfloor\le \lfloor \frac{m}{y} \rfloor\) ,记当前块内 \(x\) 的取值为 \([l,r]\) ,回代入 \(x\) 的通解,我们可以得到此时 \(\lceil \frac{l-x_0'}{dx} \rceil\le t\le \lfloor \frac{r-x_0'}{dx} \rfloor\) ,且此时的块内值均为 \(val=\lfloor \frac{n}{x} \rfloor=\lfloor \frac{n}{l} \rfloor\) ,且可以得到 \(y\le\lfloor \frac{m}{val} \rfloor\) 。记 \(limit=\lfloor \frac{m}{val} \rfloor\) ,我们回代入 \(y\) 的通解里,可以得出 \(t\ge\lceil \frac{y_0'-limit}{dy} \rceil\) 。于是根据四个不等式,我们能约束出 \(t\) 的取值范围 \([L,R]\) ,而在当前块内,我们要最大化 \(x+y=t\cdot(dx-dy)+x_0'+y_0'\) ,这个式子是 \(t\) 的一次函数式,所以最大值必然在两端点处取得, \(dx-dy\ge0\) 时取 \(t=R\) ;反之,取 \(t=L\) 。类似地,根据对称性,我们令 \(y_0\) 是最小非负整数解,那么此时 \(x_0\) 是对应的最大解,枚举一下块内值均为 \(\lfloor \frac{m}{y} \rfloor\) 的情况。值得说明的是,我们做了两次特殊的约定,但这样是不影响结果的,对称的两次处理已经可以覆盖所有最优解的情况了。
CF2133(Div.2)(4/6)
- A 显然可以把最终的速度表示出来发现中间的都消掉了,只需要看 \(a_1\) 和 \(a_n\) ,即只要数列里有两个相同的数即可。
- B 注意到每次合并,较小者必然为 \(0\) ,那么我们不妨排序后取两两相邻的数合并,最后通过 \(0\) 就可以无代价地全都合并起来。
- C 交互。考虑先用 \(n\) 次询问,得到每个点在全集中的路径长度 \(d\) 。取最大的 \(d\) 为起点 \(u\) ,考虑将所有 \(d-1\) 的点加入候选,然后用二分查找的方式判断是否是 \(d\) 的后继,也就只要判断 \(u\) 到候选的子集中是否有不小于 \(2\) 的路径长度,如果有,则必然可到达,以此类推。
- D dp 。注意到每个怪物最多受到一次坠落伤害,换言之,一个怪物只剩 \(1\) 滴血的时候相当于已经死了,因为杀死他下面的怪物,他一定会死。考虑最大化利用坠落伤害,那么有两种选择:让怪物 \(i-1\) 死亡时,怪物 \(i\) 受到 \(1\) 点坠落伤害死亡;让怪物 \(i-1\) 不受坠落伤害直接被杀死,然后怪物 \(i\) 受到 \(i-1\) 点坠落伤害死亡。当然其实倒序去思考会更简单,考虑先把当前怪物上方的所有怪物砍为 \(1\) ,然后杀死当前怪物引发连锁坠落,或者直接杀死当前怪物的下一个怪物,让当前怪物吃满坠落伤害。
CF2104(Div.2)(5/7)
- D 注意到,减少当前数字至两两互质一定是最优的,故我们可以使最终的序列均为质数, \([2,3,5,\cdots]\) 。于是我们要尽可能地让删数之后数字和大于对应长度的质数和,原数组降序排序一下即可。
- E 要使 \(t\) 不再是 \(s\) 的子序列,意味着添加字符后,整个字符串在 \(s\) 中无法完全匹配。我们贪心地考虑,每次添加字符时,选择那个能让我们在 \(s\) 中跳得最远的字符。于是,我们需要预处理每个位置后面每个字符的下一个出现位置,以及从每个位置开始跳出 \(s\) 所需的最小添加次数。记 \(nxt_{i,c}\) 表示在 \(s\) 中,从位置 \(i\) 开始,下一个字符 \(c\) 出现的位置。如果不存在,设为 \(n+1\) ;记 \(cnt_i\) 表示从位置 \(i\) 开始,最少需要添加多少个字符才能确保跳出 \(s\) 。对每个 \(i\) ,我们找出所有字符中能跳到的最远位置 \(p\) ,于是有 \(cnt_i=cnt_p+1\) 。对于每个查询字符串 \(t\) ,我们在 \(s\) 中模拟匹配 \(t\) 可以得到匹配结束的位置 \(p\) 。特别地,本题代码在边界等细节上需要注意。
2024 ICPC 新疆省赛(8/10)
- I 签到题,经典拆开来算。
- A 签到题,可以用
next_permutation直接做,注意用之前一定要先将数组升序排序。 - G 由于本题的限制是每个月必须移动到一个相邻且不同的城市,且数据范围是 \(5000\) ,考虑 dp ,记 \(f_{i,j}\) 表示第 \(i\) 个月且处于城市 \(j\) 时能获得的最大收入。于是显然有递推式: \(f_{i,j}=\max(f_{i-1,v}+a_u)\) ,其中, \(v\) 是 \(u\) 的邻居。
- F 注意到兼有删除和插入操作,所以我们必然可以让每个有贡献的数到相应的位置。换言之,我们需要给出一个贡献最大的序列,这只要求一个最长上升子序列即可。
- C 注意到题目要将一个集合划分为两个互不相交的子集,不难想到二分图。如果两个数的和是完全平方数,那么它们必须被分到不同的集合中。故,我们可以将每个数看作图中的一个节点,如果两个数的和是完全平方数,就在它们之间连一条边,于是问题就转化为了二分图染色。考虑优化一下建图,先二分找到当前 \(a_i\) 可能构成的平方数的范围,然后在该范围内枚举平方数 \(s\) ,查找 \(s-a_i\) 是否在 \(a\) 中,如果存在,则连边。
- B 满三叉树趣题一道。因为如果一个节点的祖先已经被删除,那么该节点必然早已被连带删除。因此,在每次删除操作前,该节点及其祖先是否已被删除,不断向上跳是 \(O(\log n)\) 的复杂度。对于删除操作,我们可以这么处理,先计算出子树的大小,然后再减去已删除的部分。因为子树的大小与节点的深度相关,且具备单调性,所以我们可以二分查找到该节点的深度。另外,我们可以为每个节点维护一个删除计数器,记录以该节点为根的子树中累计被删除的节点数。每次删除时,我们需要向上遍历所有祖先节点,将本次新增的删除节点数累加到每个祖先的删除计数器中。
- E 本质 dijkstra 裸题,只是更新时要加上对红绿灯的判断,以及注意终点处不需要再启动加速了。
- H 因为必须选第 \(i\) 个物品,问题就变成了从前 \(i-1\) 个物品中尽可能地多选,也就需要动态地维护前 \(k\) 小,考虑用值域树状数组。特别地,如果第 \(i\) 个物品超重了,则一个也不能选。我们可以先离散化一下,然后维护两个树状数组,分别表示离散化后的物品重量之和与物品数量。不妨二分查找最大的位置 \(k\) 使得前 \(k\) 小的物品总重量可行。总的时间复杂度是 \(O(n\log^2 n)\) 。
CF2134(Div.2)(3/6)
- B 显然最终每个数都是 \(a_i+k\cdot c_i\) ,而 $a_i+k\cdot c_i \equiv c_i+k\cdot c_i \equiv(k+1)\cdot c_i\equiv0\pmod{k+1} $ ,故不妨取 \(c_i=a_i\bmod (k+1)\) 。
- C 显然只有长度等于 \(2\) 或 \(3\) 的子数组是有用的。于是我们考虑先满足长度为 \(2\) 的子数组的约束条件,然后再满足长度为 \(3\) 的子数组的约束条件,对于后者,我们优先将靠后的数减小,显然这样是最优的。
2023 ICPC 网络赛(I)(6/12)
- L 签到题。
- A 签到题。
- J 注意到对于圆 \(C_1\) 内的任意一点 \((x, y)\) ,由于圆的对称性,存在一个关于圆心 \(O_1(a, b)\) 的对称点 \((2a - x, 2b - y)\) 也在圆内。这两个点到 \((x_0, y_0)\) 的曼哈顿距离之和为:\(| x_0 - x | + | y_0 - y | + | x_0 - (2a - x) | + | y_0 - (2b - y) |\) 。由于坐标范围分离,绝对值符号可以去掉,假设 \(C_2\) 在 \(C_1\) 的右上方,则上式即 \(2(x_0-a+y_0-b)\)。由于圆内点的分布是均匀的,且对称点成对出现,因此,本题的 \(E=| x_0 - a | + | y_0 - b |\) 。同样地,我们假设 \(C_2\) 在 \(C_1\) 的右上方,故 $E= x_0 +y_0- (a + b) $ 。后者 \(a+b\) 是定值,所以考虑最小化 \(x_0+y_0\) ,作出图来很容易发现当且当且仅当 \((x_0,y_0)\) 在 \(O_2(c,d)\) 的左下角 \(45^{\circ}\) 方向,此时 \(x_0 = c - \frac{r_2}{\sqrt2},y_0 = d - \frac{r_2}{\sqrt2}\) 。类似地,我们发现答案点一定是在 \(C_2\) 的四个 \(45^{\circ}\) 方向的点之一,再进一步的发现其实答案一定是两圆心的曼哈顿距离减去 \(\sqrt2\) 倍的 \(r_2\) 。
- D 注意到在同一连通块的点必须两两连边。因此这题可以使用并查集,算出每个连通块的大小 \(sz\) 。而一个连通块任意两点要有边的话,是需要有 \(\binom{sz}{2}\) 条边。因此可以先算出总共需要的边数,减去现有的 \(m\) 条边就是要加的边数。不过要注意题目中说了至少要加一条边。因此当算出的要加的边数为 \(0\) 时,需要选出点数最小的两个连通块,将这两个连通块全部连边。
- I 计数 dp 。从密码的要求入手,不难想到密码中需要出现大小写字母、数字的要求可需要设在状态里,共 \(8\) 种可以状压,而相邻字符不能相同则只需在转移时注意相邻两位,由此我们还能想到可以用滚动数组来优化空间。设 \(f_{i,j,k}\) 表示第 \(i\) 位上的字符为 \(j\) 且压缩状态为 \(k\) 的方案数,实际上字符一共只有 \(62\) 种,并不是很多。容斥一下即有 \(f_{i,j,k}=\sum\limits_{ch}f_{i-1,ch,k}-f_{i-1,j,k}\) ,考虑前缀和优化,记 \(sum_{i,k}=\sum\limits_{ch}f_{i,ch,k}\) ,时间复杂度为 \(O(n\times62\times8)\) 。
- G 首先注意到生成过程中每条边是独立的,因此只要是一棵合法的生成树,它的概率就是 \(\frac{1}{cnt}\) ,其中 \(cnt\) 是生成树的总方案数,可以通过对每次两侧连通块大小的乘积求和得到,用并查集实现即可。那么我们要是否判断合法,考虑在给出的生成树上模拟前述操作,维护一个并查集,记录连通块在树上的最高点。注意到,如果生成树合法,每次加的边一定在树上是某一侧连通块最高点到其父亲的边,因此每次对于一个 \(a_i,b_i\) ,先判断不连通,再判断某一侧的最高点的父亲是否与另一侧连通即可。
2024 CCPC 新疆省赛(7/10)
- C 签到题。选定两两幸运字符为一个区间,二分查询 \(pos\) 所在区间。
- B 显然问题等价于对环上点计数,考虑用拓扑排序做删去非环上的点
- J 有点意思,注意到 \(n,m\) 的范围都是 \(2\times10^5\) ,且最终枚举要 \(n\) ,所以得考虑一个复杂度较小的询问。而题中坐标的范围均是 \(20\) 且都是正整数,我们可以考虑开一个桶存储每个坐标上点的个数,然后枚举点坐标暴力计算即可。
- F 由于是从 \(1\) 走向 \(n\) ,显然选了特殊房间只会影响之后的操作,而不会影响之前的操作。换言之,如果我们从后往前遍历,可以从后置的位置转移且向前递推时没有后效性。于是,若取该奖励,对于特殊房间,需要从 \(i+a_i+1\) 的位置转移;对于普通房间,需要从 \(i+1\) 的位置转移。
- D 依旧有趣。考虑一段序列如果是好的,那么对这段序列做前缀和后,应该任意前缀和均非负。因此,如果区间 \([l,r]\) 是好的,那么 \(\forall k \in [l,r],s_k\ge s_{l-1}\) ,换言之, \(s_{l-1}\) 将是区间 \([l-1, r]\) 中所有 \(s\) 值的最小值。于是,我们不妨从后向前考虑,若此时前缀和为后续所有前缀和的最小值且总和非负时,此处可以断开得到一个序列。记 \(f_i\) 为后续所有前缀和的最小值,则有 \(f_i = \min(s_i, s_{i+1}, ..., s_n) ≤ \min(s_i, s_{i+1}, ..., s_r)\) 。 \(f_i\ge s_{i-1}\) 保证了断开子序列一定的好的,而从后往前当断则断的贪心策略确保了答案的最大化。
- G 高精度板子。
- E 考虑容斥,设 \(S\) 为 \([1, x]\) 中所有整数的集合,设 \(A_i\) 表示 \([1, x]\) 中能被 \(a_i\) 整除的数的集合,即 \(a_i\) 的倍数。我们需要求的是 \(\left|\bigcap\limits_{i=1}^n \overline{A_i}\right| = |S| - \sum\limits_{i} |A_i| + \sum\limits_{i<j} |A_i \cap A_j| - \sum\limits_{i<j<k} |A_i \cap A_j \cap A_k| + \cdots + (-1)^n |A_1 \cap A_2 \cap \cdots \cap A_n|\) ,其中,\(|A_i| = \left\lfloor \dfrac{x}{a_i} \right\rfloor\),\(|A_i \cap A_j| = \left\lfloor \dfrac{x}{\operatorname{lcm}(a_i, a_j)} \right\rfloor\),依此类推。由于 \(n\) 很小,不妨枚举所有非空子集计算 \(\text{lcm}\) ,并根据子集大小奇偶性暴力计算。
2024 ICPC 上海区域赛(4/13)
- I 签到题。显然每次考虑最大的 \(k\) 个数,不过要注意取模的问题。
- C 注意到,奇数可以删去偶数,但偶数只能删去偶数。换言之,有一个人始终只能删去偶数,而另一个人如果能用奇数删去一个偶数即为必胜策略。
- B 考虑根据题意模拟 dfs 过程,按顺序处理目标排列中的每个顶点。如果当前节点 \(u\) 可以直接到达下一个点 \(v\) ,则直接到达;如果 \(u\) 不能直接到达 \(v\) ,则考虑 \(u\) 是否有其他出边,如果有,则一定要加边,反之,则可以回溯到 \(u\) 的父节点重复上述判断逻辑。值得注意的是,如果当前连通分量已经走完了,那么我们可以选定点 \(v\) 为下一个连通分量的起点。每次访问节点 \(v\) 后,从所有与 \(v\) 相连的节点的邻接表中删除 \(v\) ,这样就保证了 dfs 的访问不会重复。我们可以用两个邻接表来模拟,一个保存原始图结构,一个用于动态删除已访问边,再用一个父亲数组来记录 dfs 树的结构便于回溯。
- G 考虑二分中位数,不妨对题目要求进行几何转化,对于每条红线 \(i\) 和候选值 \(x\) 有如下要求:若 \(a_i > 0\) ,则 \(c_j \ge\left \lceil \frac{(x - b_i)}{a_i}\right \rceil\) ;若 \(a_i<0\) ,则 \(c_j \le\left \lfloor \frac{(x - b_i)}{a_i}\right \rfloor\) ;若 \(a_i=0\) ,则 \(b_i\ge x\) 。换言之,对于具体的 \(i\) 我们能映射对应的区间。我们不妨对所有区间和 \(c\) 数组进行排序,每次用二分找到最小的满足条件的蓝线,总的时间复杂度是 \(O(n\log^2n)\) 。值得注意的是负数除法取整这类问题。
2023 ICPC 济南区域赛(3/13)
- D 签到题。注意到如果某个数的取值区间长度大于等于 \(10\) ,那就可以取遍每一个数字,必然能与另一个数的个位凑出 \(9\) 。反之,暴力枚举即可。
- I 签到题。我们不妨找到最小的 \(u\) ,满足 \(u \neq a_u\) (若没有这样的 \(u\) ,则序列已经有序),然后找到最大的 \(v\) , 满足 \(a_v < a_u\) ,排序区间 \([u, v]\) 。可以证明至多进行 $\left \lfloor \frac{n}{2} \right \rfloor $ 次操作即可是序列有序。
- A 显然括号只有方/圆两种。注意到一个括号序列合法,当且仅当其不存在长度大于等于 \(3\) 的连续段,且存在不超过 \(2\) 个长度大于等于 \(2\) 的连续段。
2023 ICPC 南京区域赛(4/13)
- I 签到题。如果第 \(x_i\) 次操作后计数器的值为 \(v_i\) ,说明第 \(x_i − v_i\) 次操作是清零,且 \([x_i − v_i + 1, x_i]\) 这个操作区间内没有清零操作,把区间排序后进行判断即可。
- F 很牛的一道题啊。由于操作结果会互相覆盖,因此对于每个位置,只有最后修改这个位置的操作才决定了这个位置的值。也就是说,最后修改这个位置的操作必须在其它修改这个位置的操作之后进行。考虑将原操作序列建模成一个有向无环图 \(G\) ,第 \(i\) 个操作向第 \(j\) 个操作有一条连边 \(i\to j\) 当且仅当存在某个位置 \(t\) 使得操作 \(j\) 是在原顺序中修改位置 \(t\) 的最后一次操作,且操作 \(i\) 也修改了 \(t\) 。现在问题转化为,给定一张有向无环图 \(G\), 问 \(G\) 是否存在一个不同于 \(1,2,\cdots,n\) 的拓扑序。我们也可以显式地建立图 \(G\) ,做拓扑排序得到字典序最大的拓扑序列,判断与字典序最小的原始拓扑序(即 \(1,2,\cdots,n\) )是否相等即可。标答的做法是尝试交换 \(i\) 和 \(i+1\),如果交换任意两个相邻元素都无法得到新的合法拓扑序,说明 \(G\) 依赖关系至少是一条从 \(1\) 到 \(n\) 的链,即拓扑序唯一。实现上,我们并不需要将 \(G\) 显式地建立出来,只要枚举并判断操作 \(i\) 和 操作 \(i+1\) 之间是否有连边。如果没有,则找到了一组解,将操作 \(i\) 和操作 \(i+1\) 交换即可。
- G 注意到一定存在一个最优选法同时满足以下两个条件:如果存在物品 \(a,b\) 满足 \(a\) 被免费选走, \(b\) 被付费选走,那么 \(w_a\ge w_b\) ,否则我们可以改成免费选 \(b\) ,付费选 \(a\) ,方案不会变劣;如果存在物品 \(a,b\) 满足 \(a\) 被免费选走, \(b\) 没有被选走,那么 \(v_a\ge v_b\) 。否则我们可以改成免费选 \(b\) ,不选择 \(a\) ,方案不会变劣。因此,如果我们将所有物品按照 \(w_i\) 从小到大排序,那么对于最优策略而言,一定存在一个分界点 \(M\) ,满足 \(i\gt M\) 的物品中,价值前 \(k\) 大的物品被免费选走。对于每个 \(i\) ,可以通过维护一个堆来预处理出从第 \(i\) 个物品开始的后缀免费选出 \(k\) 个物品的最大价值之和。因此我们只需要对每个前缀维护出 \(0/1\) 背包的结果即可。
- M 注意到 \(\min(f_i, g_i) = f_i + g_i − \max a_i\) 。考虑用线段树维护最大值数组。当修改某个柱子高度时,可能影响其右侧所有 \(f\) 值和左侧所有 \(g\) 值。因此,我们可以用线段树找到需要更新的区间。具体地,对于左最大值数组 \(f\) ,我们查询第一个大于新值的索引,更新从修改位置到该索引之前的所有值,对于右最大值数组 \(g\) ,我们做类似处理。于是每次操作后,可以直接查询两棵线段树的权值和。总的时间复杂度为 \(O((n + q) \log n)\) 。
CF2140(Div.2)(3/7)
- A 统计 \(1\) 的个数记为 \(k\) ,显然最优操作下,答案为后 \(k\) 位中 \(0\) 的个数。
- B \(x\#y=x\times 10^m+y\) ,其中 \(m\) 是 \(y\) 的位数。由题意,需满足 \(x\times 10^m+y \equiv 0 \pmod{x+y}\) 。由于显然有 \(y \equiv -x \pmod{x+y}\) ,代入则有: \(x\times 10^m-x \equiv 0 \pmod{x+y}\) ,即 \(x\times (10^m-1) \equiv 0 \pmod{x+y}\) 。那么我们不妨令 \(x+y=10^m-1\) ,则上式显然成立。因为 \(1\le y \lt 10^9\) ,所以我们钦定 \(m=9\) 即可。和之前那个模 \(k+1\) 的题有点像。
- C 首先,我们来分析博弈过程。由于 Bob 试图最小化 \(f(a)\) ,他会发现任何交换操作都会增加 \(\text{cost}\) ,而 \(\text{cost}\) 的增加总是非负的。Alice 总是可以逆转 Bob 的操作,并进一步增加 \(\text{cost}\) 。因此,Bob 的最佳策略是在自己的第一回合就结束游戏,以防止 \(\text{cost}\) 的进一步增加。这样一来,问题就简化为:Alice 应该进行怎样的单次操作,来最大化 \(f(a)\) 。显然共有三种情况:不进行任何交换、同奇偶交换和异奇偶交换。前两者比较显然略过,后者当 \(l\) 是奇数,\(r\) 是偶数时,增量为 \((2a_r+r)−(2a_l+l)\) ;当 \(l\) 是偶数,\(r\) 是奇数时,增量为 \((2a_l−l)−(2a_r−r)\) 。可以通过预处理奇数位置上的 \(2a_i+i\) 的最小值和偶数位置上的 \(2a_i-i\) 的最大值来使总的复杂度降为 \(O(n)\)。
2025 ICPC 网络赛(II)(1/12)
- E 面向数据编程。首先注意到样例里都和 \(7\) 的幂次相关,而显然 \(7\) 代表 \(2^m-1\) ,不妨记为 \(x\) 。然后发现答案要分奇偶讨论,奇数情况下显然答案为 \(x^{n-1}\) 。偶数情况下不妨再打个表,分解一下发现除开 \(7\) 的幂次外,剩下的部分是 \(6\) 和 \(8\) ,也即是 \(7-1\) 和 \(7+1\) ,可以考虑都按照 \(7\) 来凑出一个多项式,不难得到一个等比数列求和的式子。推广到一般情况求和,就做完了,最后的式子还是比较简洁的。
CF2148(Div.4)(6/7)
- E 记每个数值 \(x\) 的出现次数为 \(vis_x\) ,根据题意,我们要将其均分为 \(k\) 份,记 \(tar_x=\frac{vis_x}{k}\) 表示每个数值 \(x\) 在每个区间需要的出现次数。我们可以滑动窗口来做,不妨统计每个窗口内数值 \(x\) 的出现次数 \(cnt_x\) ,只要 \(cnt_x\le tar_x\) ,我们就一定可以将剩余元素平均分配到其他 \(k-1\) 个多重集中。
- G 对于每个长度前缀,最优的重新排序方法是重新排序所有前缀元素,使得 \(a\) 的前 \(k\) 个元素都能被同一个除数 \(d\) 整除,而第 \(k+1\) 个元素不能被 \(d\) 整除,这确保了 \(\gcd(a_1,...,a_k)>\gcd(a_1,...,a_{k+1})\) 始终成立。因此,我们将问题简化为:找到一个因数,使得它能够对每个前缀进行最多元素的整除。我们可以预处理所有数字的因数,并在遍历数组时,对前缀每个元素的因数累加,记为 \(cnt_{d}\) 。特别地,如果 \(cnt_{d}=i\) ,即前 \(i\) 个元素均被 \(d\) 整除,这不符合条件,所以我们依次考虑次大的情况。当然,随着遍历的进行,\(d\) 后续可能会成立,所以我们要特别存储、判断一下。预处理是调和级数级别的时间复杂度 \(O(n\log n)\) ,暴力统计每个元素的因数的时间复杂度是 \(O(n\sqrt n)\) 。
2023 ICPC 沈阳区域赛(3/13)
- C 签到题。
- J 注意到每次选择的两个点中不能有叶子结点,否则树必然是同构的。于是发现,每一步合法操作都会使叶子数恰好增加 \(1\) ,叶子数达到最大值 \(n − 1\) (除了 \(n = 2\) 时是 \(n\) )时游戏结束,只需关注初始局面叶子数以及最终局面的叶子数的奇偶性。
- E 记 \(f_{i,j,0/1}\) 表示从初始状态开始要达到与家在河不同侧的岸边有 \(i\) 只羊和 \(j\) 只狼且农夫在与家不同侧/同侧的岸边时的最少步数。我们以 \(f_{X,Y ,0} = 0\) 为初值进行 BFS ,每次枚举和农夫一起乘船的羊和狼的数量进行转移,最终结果为 \(\min\limits^Y_{j=0} f_{0,j,1}\) 。时间复杂度为 \(O(n^4)\) ,其中 \(n=100\) ,可以认为是状态数乘每个状态的转移数。
CF2143(Div.2)(4/7)
- B 考虑贪心。按升序遍历折扣集合,并将其应用于按降序排序的商品集合。如果商品数量不足,则将折扣券省略。
- C 显然我们可以令每一条边都是 \(\max(x,y)\) 。我们不妨让 \(p\) 值的大小关系代表边的方向。如果 \(x≤y\) ,那么新生成的图中的边将是 \(u\to v\) ,否则将是 \(v\to u\) ,容易看出这个图是 DAG 。我们不妨进行拓扑排序,排序靠前的顶点优先级更高,分配更大的 \(p\) 值。
- D1 我们称 LDS 是最长递减子序列。原问题是统计可以用红蓝两色着色的子序列数量,使得所有逆序对的两端颜色不同。注意到,这等价于统计 LDS 长度 \(≤2\) 的子序列数量。因为如果 LDS 长度 \(>2\) ,存在 \(≥3\) 个元素的递减序列,它们两两形成逆序对,需要 \(≥3\) 种颜色;如果 LDS 长度 \(≤2\) ,可以给每个元素染色为"从该位置开始的 LDS 长度",保证逆序对颜色不同。记 \(f_{cur,j,k}\) 为前 \(i\) 个元素中选择子序列的方案数,记 \(j\) 表示选中子序列的最大值, \(k\) 表示最大元素前面的一个更大的元素,然后我们 \(O(n^3)\) 枚举即可。
2023 CCPC 江苏省赛(5/12)
- I 签到题。
- H 签到题。因为操作的是后缀,所以遍历字符串,每次当前位置不相等时就要转动。
- J 签到题。
- A 注意到要求 \(S_{10^{100}}\) 的长为 \(m\) 的后缀,因此考虑暴力将 \(S_0\) 按构造方式操作,求出一个长度大于 \(2m\) 的 \(S_k\) ,取 \(S_k\) 长度为 \(m\) 的后缀进行变换即可。又注意到变换的循环节是 \(26\) ,故 \(S_0\) 的每个字符后移 \((10^{100}-k)\mod {26}\) 位即可。
- F 设 \(f_i\) 表示还剩下 \(i\) 个原料时的最大期望,不难得出 dp 方程。特别地, \(B = 1\) 时需要特判。此时只选择最优的一种,分别算出各自的期望值然后取较大即可。
2025 CCPC 网络赛(3/13)
- E 签到题。
- K 注意到倒序排列是最优解,答案为 \(\frac{n(n+1)}{2}\) 。
- G 考虑考虑根号分治。按 \(x\) 和 \(y\) 的出现次数,遍历那个出现次数少的,找另一个。有一者出现次数小于 \(B\) 就暴力,单次复杂度 \(O(B\log n)\) ,总复杂度不超过 \(O(qB\log n)\) ;两个出现次数都大于 \(B\) 就暴力之后记忆化,由于总是遍历那个出现次数少的,那么对于出现次数为 \(c\) 的 \(x\) ,枚举次数不超过 \(O(c\cdot \frac{n}{c})=O(n)\),又由于满足这个限制的 \(x\) 只有 \(\frac{n}{B}\) 个,总复杂度不超过 \(O(n\frac{n}{B}\log n)\) ,显然取 \(B=\sqrt\frac{n^2}{q}\) 时复杂度为 \(O(n\sqrt q\log n)\) 最优。特别地,注意特判 \(x=y\) 。当然也可以直接暴力做,遍历那个出现次数少的然后加个记忆化。所以暴力的复杂度也就是根号的,没必要再手动分治了,复杂度与前述相同。
CF2147(Div.1+2)(4/10)
- B 注意到 \(n\) 的两次出现相距 \(n\) ,而所有其他值出现的距离都是其值的两倍。我们不妨将两个 \(n\) 放在第 \(1\) 个位置和第 \(n+1\) 个位置,然后以第二个 \(n\) 作为基准,按顺序排列从 \(1\) 到 \(n−1\) 的数字。于是可以得到形如:\([ n, n-1, n-2, ..., 3, 2, 1, n, 1, 2, 3, ..., n-2, n-1 ]\) 的数列。
- C 奇妙题,需要观察不少性质。其一,如果我们有两个连续的 \(1\) ,则该方块左右两侧的兔子是独立的,我们可以将问题拆分成多个子问题;其二,如果我们以某种方式拆分字符串,使得每个子问题不包含两个连续的 \(1\) ,则字符串 \(101010…0101\) (没有连续的 \(0\) )是可解的,当且仅当 \(0\) 的数量是偶数,因为我们给奇数位放向右看的兔子,偶数位放向左看的兔子,恰好放完并相互约束;其三,如果我们有两个连续的 \(0\) ,不妨将多出的 \(0\) 放入 \(0\) 数量为奇数的上述交替子串中;其四,如果字符串以 \(0\) 开头或结尾,我们可以忽略该位置,将兔子朝向边界放置。因此,我们唯一需要寻找的就是符合这种交替模式且 \(0\) 的个数为奇数的字符串。当然,本题还有较为优雅的 dp 做法和较为丑陋的 2-SAT 做法。
- D 注意到,实际上的 Alice 和 Bob 对于分数的策略是固定的。考虑奇偶性,若元素值 \(x\) 为偶数,其贡献可平均分配给 Alice 和 Bob ,使其各得 \(\frac{x}{2}\) 分;若元素值 \(x\) 为奇数,其贡献中会有 \(1\) 个额外得分需要通过竞争决定归属,即先者取得额外一分后使该奇数变为偶数。于是最优策略肯定是每次优先选择出现次数最多的奇数 \(x\) 。
2024 ICPC 沈阳区域赛(2/13)
- J 签到。
- D 注意到答案与两个序列的逆序对数之差的奇偶性相关,为奇数则 Alice 胜,为偶数则 Bob 胜。对于修改操作,我们同样维护奇偶性是否改变即可。注意到,每次修改相当于将区间 \([l,r]\) 分割为 \([l,k]\) 和 \([k,r]\) 两段,然后交换位置,当且仅当这两个区间的长度均为奇数时,答案奇偶性会改变。
2022 ICPC 沈阳区域赛(3/13)
- D 签到题。
- C 注意到,区间越大越好,故 \(r-l=d\) 。我们可以 \(O(n)\) 地枚举 \(l\) ,然后再求答案。类似地,还要枚举一次 \(r\) ,总的时间复杂度是 \(O(n^2)\) 。
2025 ICPC 台湾网络赛(5/12)
- A 签到题。
- B 签到题。
- D 典题。显然可以区间 dp ,记 \(f_{l,r}\) 表示区间 \([l,r]\) 是回文的编辑次数。
- C 注意到,对于每个起点其路径都是唯一的。
- E 类似洪水泛滥,我们移动危险区域内的石板,如果有空地就可以直接移动,如果没有则要先移动外界石板腾出空地。答案是移动路径上的最大编号,所以我们用优先队列每次移动编号最小的石板。
2025 ICPC North America Championship(1/13)
- K 由于不能悬空,所有每个构造出来的全是
.的空间必须满足上宽下窄或上下同宽,不能上窄下宽,所以显然当前层在不用扩宽的情况下,最多填上一层.的数量。记最顶上一行为第 \(1\) 行,显然如果 \(x_i> x_{i−1}\) 就需要扩宽,由于每次扩宽是还要在最后加一个#来保证残留液态树脂被包裹在里面,所以每次拓宽的长度为 \(x_i−x_{i−1}+1\) ,由于至少有一行的残留液态树脂单元数量大于零,所有最左边一定是有#的,所以答案初始赋值为 \(1\) 。明显当宽度无限时一定可以构造出满足条件的情况,所有不会有无解的情况。

浙公网安备 33010602011771号