北京市集训模拟赛总结
2025.2.7 模拟赛
成绩
124pts/rank6。T1拿满了,T3拿了24.
T1
比较水的题目,大概在上位绿左右,可惜我想了半个多小时才想出正解。
题意简述
定义 \(f(l,r)\) 为区间 \([l,r]\) 内出现了多少不同数字。
做以下操作:
- 将 \(a_x\) 修改为 \(y\)
- 查询 \(\sum\limits_{i=1}^x\sum\limits_{j=i}^x f(i,j)\) 的值。
\(1\le n,m,a_i \le 2\times 10^5\)
做法
正难则反,我们查询 \(g(x,y)\) 表示 \([x,y]\) 内有多少重复的数字(如 \(3\) 个 \(2\) 则算作 \(2\) 个)。
这里有个 trick 就是维护 pre_i 表示位置 i 相同的数字上一次出现的位置。显然所有 \(l\le pre_i,r\ge i\) 的 \(g(l,r)\) 都会 \(+1\)。
由于只查询前缀,我们维护 \(sum\) 数组作为 \(pre\) 数组的前缀和数组。那么对于每个 \(i\),\(j\in [i,n]\) 的 \(sum_j\) 都会 \(-pre_i\)。这里用区修区查树状数组即可维护答案。
我们再利用另一个 trick:用 set 维护 \(pre\),即给每个颜色开一个 set。这样可以 \(O(1)\) 修改。
那么这道题目就做完了。
T2
一道MST的好题。大概在蓝色水平。
题意简述
给定一颗 \(n\) 个点,\(m\) 条边的图。保证连通,可能有重边但不会有自环。每个边有两种权值 \(a_i,b_i\)。
对于所有 \(1\le k\le m\),求出以下问题的答案:恰好选取 \(k\) 条边权值取 \(a_i\),恰好选取 \(m-k\) 条边边权取 \(b_i\) 的最小生成树的权值和的最大值是多少。
解法
使用 MST 配合 DP。
对于一条边 \((x, y, a, b)\),我们分开考虑 \(a_i, b_i\):
- \(a ≤ b\):拆成两条边 \((x,y,a,1)\) 和 \((x,y,b,0)\)。
- \(a > b\):拆成两条边 \((x,y,b,−1)\) 和 \((x,y,a,0)\)。
将拆后的 \(2m\) 条边按边权从小到大排序,边权相同时,将类型为 \(0\) 的边排在后面,从前往后依次考虑每条边:
- \((x,y,w,1)\):这条边可选可不选,若选了则会多一条边边权来自 \(a\),此时若 \(x\) 和 \(y\) 不连通,则 MST 的边权和要增加 \(w\)。
- \((x,y,w,−1)\):这条边可选可不选,若选了则会少一条边边权来自 \(a\),此时若 \(x\) 和 \(y\) 不连通,则 MST 的边权和要增加 \(w\)。
- \((x,y,w,0)\):这条边对应的另一条边在此之前已经考虑过。若另一条边没选,则这条边必须要 选,否则选不选不会影响答案(不会影响 MST 边权和,边权来自 \(a\) 的数量在另一条边处计算 到了)。此时如果 \(x\) 和 \(y\) 不连通,则 MST 的边权和要增加 \(w\)。
设 \(f_{i,S,j}\) 表示考虑了排序后前 \(i\) 条边,所有点连通性的最小表示为 \(S\),有 \(j\) 条边边权来自 \(a\) 时, 最小生成树边权和的最大值是多少。预处理后可以做到 \(O(1)\) 转移。
时间复杂度 \(O(m^2 \text{Bell}(n))\),其中 \(\text{Bell}(9) = 21147\)。
T3
神奇题目。无法理解。上位蓝 or 紫。
题意简述
给定序列 \(\{a_n\}\)。
对于三元组 \((l,r,v)\),如果 \(a_{l-1}\le v\) 那么 \(l\leftarrow l-1\),如果 \(a_{r+1}\le v\) 那么 \(r\leftarrow r+1\),否则消耗 \(1\) 的代价令 \(v\leftarrow \min(a_{l-1},a_{r+1})\)。
定义 \(f(i)\) 为 \((i,i,a_i)\) 扩展为 \((1,n,任意数)\) 的最小代价。
做 \(m\) 个操作:
- 交换 \(a_x,a_{x+1}\)
- 求 \(\sum\limits_{i=x}^y f(i)\)
解答
考虑 \(m = 1\)。对于初始位置 \(x\),首先可以用单调栈求出其能直接拓展出的区间 \([l, r]\),此时假设 \(a_{l−1} < a_{r+1}\),\(v\) 会变为 \(a_{l−1}\),不难发现此时答案和以 \(l − 1\) 作为初始位置的答案相同,于是我们有 $ans_x = \(ans_{l−1} + 1\)。用记忆化搜索即可求出每个点的答案。
进一步分析过程,我们可以这样表示答案:记 \(L\) 为 \(a_1, a_2, . . . , a_x\) 的后缀最大值构成的集合,\(R\) 为 \(a_x, a_x+1, . . . , a_n\) 的前缀最大值构成的集合,则答案就是 \(|L \cup R| − 1\)。
假设 \(a_x < a_{x+1}\),我们考察交换 \(a_x, a_{x+1}\) 对答案的影响:
- 对于\([1,x−1]\),找到最靠右的 \(a_p ≥ a_x\),若 \(a_p \ne ax\),则对于 \(p+1 ≤ i ≤ x−1\) 答案都会变小 \(1\)。
- 对于\([x+2,n]\),找到最靠左的 \(a_p ≥ a_x\),若 $a_p \ne a_x,则对于 \(x+2 ≤ i ≤ p−1\) 答案都会增大 \(1\)。
- 对于 \(x, x + 1\),用最初的方法计算答案即可。
用线段树维护上述过程即可。
2025/2/9 模拟赛
成绩
T1拿了20,T3拿了10pts。rank15.
T1
题目大意
给定 \(10^5\times 10\) 的矩阵,每个点到上下左右的点有一条有权边(无负权),给定 \(10^5\) 次询问求 \((x_1,y_1)\) 到 \((x_2,y_2)\) 的距离。
解法
trick: 由于询问可以离线,加上询问可以分成数段处理,所以考虑分治(类似cdq)。
考虑线段树,若计算从 \((𝑙, 𝑥)\) 到 \((𝑟, 𝑦)(mid = ⌊ \frac{𝑙+𝑟}{2} ⌋)\) 的最短路径 \(𝐹 (𝑙, 𝑟, 𝑥, 𝑦)\) (注意这里定义的就是最后输出的答案,也就是说这个最短路可以访问 \([𝑙, 𝑟]\) 外部的 点),注意到这条路径一定会在 \(mid − 1, mid\) 之间有一条横着的边,所以枚举这个 横着的边就可以分治:
但是叶子上的 \(𝐹 (𝑖, 𝑖, 𝑥, 𝑦)\) 应该怎么求呢?它肯定是若干个从 \((𝑖,? )\) 到 \((𝑖,?? )\) 的路 径拼接而成的,而这样的路径如果在中间不会经过 \(𝑖\),那么一定是完全在左侧或者 完全在右侧的,所以我们可以对每个 \(𝑖\) 处理
• \(𝐿(𝑖, 𝑥, 𝑦)\) 表示从 \((𝑖, 𝑥)\) 出发,中途的横坐标永远 \(< 𝑖\),最后到达 \((𝑖, 𝑦)\) 的最短路。 • \(𝑅(𝑖, 𝑥, 𝑦)\) 表示从 \((𝑖, 𝑥)\) 出发,中途的横坐标永远 \(> 𝑖\),最后到达 \((𝑖, 𝑦)\) 的最短路。
最后一遍 Floyd 求出 \(𝐹 (𝑖, 𝑖, 𝑥, 𝑦)\).
而 \(𝐿(𝑖, 𝑥, 𝑦), 𝑅(𝑖, 𝑥, 𝑦)\) 的求法也简单,这里以 \(𝐿(𝑖, 𝑥, 𝑦)\) 为例,先将 \(𝐿(𝑖 − 1,?,? )\) 做 Floyd 就可以获得
• 从 \((𝑖, 𝑥)\) 出发,中途的横坐标永远 \(≤ 𝑖\),最后到达 \((𝑖, 𝑦)\) 的最短路。
那么 \(𝐿(𝑖, 𝑥, 𝑦)\) 就只需要在其基础上加上 \(𝑥, 𝑦\) 两处的横向边权值就可以获得。 时间复杂度:\(𝑂(𝑛𝑚3 + 𝑞𝑚2 log 𝑛)\).
2025.2.10 模拟赛
成绩
t2得了20pts,其余的挂了。rk34. 🪞<=小丑🤣🤣🤣
T1
题意简述
给定一个数组,你要选出一个 大小为 \(k\) 子集,子集中每一对 \(|a_i-a_j|<1000\) 产生 1 的贡献。求最大贡献。
值域:
| \(n\) | \(a_i\) | $ k$ |
|---|---|---|
| 150 | 2000 | \(n\)左右 |
| 90 | 3000 | \(n\)左右 |
| 65 | 4000 | \(n\)左右 |
做法
十分的逆天。大概是由于老师——xcyle是高一拿Au的高手吧。
首先贪心是假的(在 值域 较小的时候可以过,事实上,这题可以分三类讨论水过)。
对于每个\(i = 1,...,n\),令 \(b_i\) 和 \(c_i\) 分别表示ai 的整数部分和小数部分,即bi = [ai] ci = ai − bi。注意,0 ≤ bi < D。将 (b1, c1), (b2, c2), ..., (bn, cn) 按照 ci 的非递减顺序排序。由于
∑∑∑
i,j ∈S
[0<aj −ai <1]= =
[bi =bj]+ [bi =bj −1∧ci >cj] i,j ∈S
所有满足S ⊆[s]且 们有
∑
j∈S
j≤s
[bj =i]=ri 对于所有i=0,1,...,D−1的S中g(S)的最小值。我
fs,R = min(fs−1,R, fs−1,R′ + rbs−1)
i,j ∈S,i<j ∑∑
[|bi −bj|≤1]− [bi =bj −1∧ci ≤cj] i,j ∈S
i,j ∈S,i<j 我们只需要在每个整数部分选取元素数量固定的情况下,最小化 g(S) = ∑ [bi = bj −
1∧ci ≤cj]。 ∑ 对于每个 s = 1,2,...,n 和 R = (r0,r1,...,rD−1),其中 0 ≤ ri ≤
i,j ∈S
[bj = i],令 fs,R 为
其中R′ =(...,rbs −1,...).
边界条件为:f0,0,...,0 = 0,且对于其他不满足条件的状态 (s, R),fs,R = +∞。 完成动态规划后,最终答案为
R=(r0,...,rD−1),∑D−1 ri=k
i=0 i=0
时间复杂度为 O ̃(n(k+D−1))。 D−1
2

浙公网安备 33010602011771号