2026/07/01 赛后总结
解题报告分析 1
分析每道题的核心逻辑链条,尝试总结出某些类型的题目通用思考方式。
\(^{*}\) :不知道的 trick 或者方法
一种基本分析:
- 构建基本数据:不考虑会产生额外复杂贡献计算的量 \(\rho\),列出最朴素的表达式
- 考虑引入一个量 \(\rho\),分析其对基本数据产生的影响 \(\delta\)
- 利用 \(\delta\) 寻找一些性质或优化状态定义等
Writ Date:7/1/2026
T1 Bucket
1. 观察题目中特殊的操作
“每次可以选择若干个水桶合并成一个新水桶。新水桶的容量等于这些水桶容量的最大值,漏水速度等于这些水桶漏水速度的最小值。” 合并操作。
${{\color{Red} 思考1:} } $
$\Longrightarrow $ 有什么特殊的性质 $\Longrightarrow $ 与什么东西相关 $\Longrightarrow $ 合并的数量 $\Longrightarrow $ 合并数量是否影响答案?
注意到新水桶 \((V,L)\) 是如何产生的:至多两个不同的桶,一个贡献 \(V\) 另一个贡献 \(L\)。$\Longrightarrow $ 如果合并数量大于2个,出来产生贡献的桶以外,其他的桶都不会对答案产生影响,反而不如不合并。
${{\color{Red} 结论1:} } $
选择若干对水桶 \((i,j)\) 进行两两合并是一个最优策略。
2. 形式化的给出要求的东西
考虑使用数学方式推导题目答案的表达式。
考虑对任意给定的一个时间 \(t\),对答案的构成进行分类讨论:
\(\alpha\):不进行合并,则答案为
\(\beta\):考虑合并水桶 \(u,w\),则这样一个操作的额外贡献为 $\Longrightarrow $ 这是一种常见的思考方向,提取单个操作计算贡献的变化。
利用恒等式 \(^{*}\):\(\max(x,0)=x-\min(x,0)\) 化简上式,得
那么合并 \(k\) 对这样的水桶,最大收益就是选最大的前 \(k\) 个 \(\min\),最小的前 \(k\) 个 \(\max\)。
令 \(A_i=\min(v_i,t\times l_i)\),\(B_i=\max(v_i,t\times l_i)\),那么最终答案就为
又因为 \(A\cup B\) 其实就是 \(\{v_i,t\times l_i \}\) 的全集,那么问题就变为:
${ {\color{Red} 结论2:} } $
对于时间 \(t\),最优剩余水量的总和,等于将所有 \(n\) 个 \(v_i\) 以及 \(n\) 个 \(t \cdot l_i\) 放在一起(共 \(2n\) 个数),取其中最大的 \(n\) 个数求和,最后再减去 \(t \cdot \sum l_i\)。
至此,此题就可以开始构建代码了。
核心逻辑:观察特殊操作 $\Longrightarrow $ 思考影响该操作的量 $\Longrightarrow $ 分析该操作的特性 $\Longrightarrow $ 利用特性形式化给出答案表达式 $\Longrightarrow $ 利用一些特征化简表达式 $\Longrightarrow $ 构建解题代码
T2 Dinner
1. 整理题意
两种选择,每种选择存在一个代价和一个贡献,同时对于选择二,满足条件后将产生额外代价。
$\Longrightarrow $ 对于代价+贡献模型,转化为背包DP。 (此处没有想到,缺少建模的意识)
2. 构建DP
先考虑构造 \(dp[i][j]\) 表示前 \(i\) 天,第 \(i\) 天出去吃,总代价为 \(j\) 的最大贡献。由于 \(j\le 10^{18}\),但是贡献最多只有 \(3000\times 10=3\times 10^4\) 很小,因此考虑使用价值维DP进行优化。
此时,若直接定义 DP 状态,发现不知道怎么转移(因为存在隐藏的附加代价),不妨对附加代价进行分析:
-
假设每天都选选择1,那么得到基础状态:
\[\text{基础贡献}=\sum a_i\\ \text{基础代价}=\sum b_i \] -
考虑第 \(i\) 天变为选择二产生的变化:
\[\text{贡献增加} w_i=c_i - a_i\\ \text{代价增加} cost_i = d_i-b_i \]同时还会附带上额外的代价:如果上一次出门吃饭是第 \(p\) 天(若未出门过视为 \(p=0\)),且 \(\sum_{j=p+1}^{i-1}x_j > K\),则第 \(i\) 天额外产生惩罚花费 \(e_i\)。
不妨将额外获得的满意度作为状态。
定义 \(dp[i][j]\) 表示前 \(i\) 天中,第 \(i\) 天出去吃饭,且此时累计获得的额为满意度为 \(j\) 时的最小代价。
显然,\(dp[i][j]\) 有前面某个 \(dp[p][j],(0\le p <i)\) 转移过来。不妨在这个转移过程中将附加代价考虑进来。
由于 \(p \to 0\) 时,$\sum x_j \uparrow $,因此**存在一个分界点 \(\lambda\) **使得:
- 当 \(p\le \lambda\) 时,\(\sum x_j > K\),都要考虑增加 \(e_i\)
- 当 \(p< \lambda <i\) 时,\(\sum x_j \le K\),不考虑增加 \(e_i\)
$\Longrightarrow $ DP 转移分段,转移方程为
时间复杂度 \(O(n^2W)\),考虑优化。
3. 优化DP
因为 \(x_i > 0\),所以 \(\sum x_j \uparrow\),那么随着 \(i \to n\),\(\lambda\) 也是单增的。分别维护上面分类的两段:
-
区间 \([0,\lambda]\) 的最小值:
维护指针 \(it\),同时随指针的更新同步更新满意度的前缀最小值,支持 \(O(1)\) 查询区间最小 -
区间 \([\lambda +1,i-1]\) 的最小值
由于这个区间的两个端点都是单增的,考虑使用单调队列优化,利用滑动窗口更新最小值。
这样就可以把 DP 优化到 \(O(nW)\) 了。
4. 求解答案
对于每个询问,考虑在 DP 中找出所有有意义的 \((cost,w)\) 集合,然后就是求预算相关的前缀最大值,由于单调,使用二分查找即可。
至此,这道题就可以开始构建代码了。
核心逻辑:抽象出题目结构(明确是”一个代价+一个贡献“的结构) $\Longrightarrow $ 进行对应算法的建模(背包DP) $\Longrightarrow $ 根据数据范围考虑适当优化 $\Longrightarrow $ 发现常规定义不好记录代价 $\Longrightarrow $ 回归基本分析 $\Longrightarrow $ 考虑新的状态定义 $\Longrightarrow $ 观察代价的性质(整段覆盖,存在分界点) $\Longrightarrow $ 观察整体性质(具有单调性) $\Longrightarrow $ 构造 DP 并进行转移 $\Longrightarrow $ 考虑优化
今日其他收获
Trick:
1. 有关二分图建模
一个二维坐标
(x,y),如果规则始终分别引用x和y,而没有把整个坐标当作不可分割的整体,那么就要尝试把(x,y)拆成两个维度建图。
这类题有很多共同特征:
- 一个格子 = 行 + 列(本题)
- 一个矩形 = 两条横线 + 两条竖线
- 一个棋盘格 = 黑点 + 白点
- 一个单词 = 前缀 + 后缀
- 一个区间 = 左端点 + 右端点
只要发现对象实际上是由两类实体组合而成,并且题目的操作始终围绕这两类实体进行,那么就应该警惕是否能建立一个二分图。
思考方向:
- 坐标
(r,c)是否可以拆成两个独立维度? - 题目的所有操作,是不是都只在操作
r和c,而没有依赖格子本身的其他信息? - 如果把每个
(r,c)看成r与c之间的一条边,操作会不会变得更简单?

浙公网安备 33010602011771号