2026/07/01 赛后总结

解题报告分析 1

分析每道题的核心逻辑链条,尝试总结出某些类型的题目通用思考方式。

\(^{*}\) :不知道的 trick 或者方法

一种基本分析:

  1. 构建基本数据:不考虑会产生额外复杂贡献计算的量 \(\rho\),列出最朴素的表达式
  2. 考虑引入一个量 \(\rho\),分析其对基本数据产生的影响 \(\delta\)
  3. 利用 \(\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\):不进行合并,则答案为

\[\sum \max(v_i-t\times l_i,0) \]

\(\beta\)考虑合并水桶 \(u,w\),则这样一个操作的额外贡献为 $\Longrightarrow $ 这是一种常见的思考方向,提取单个操作计算贡献的变化。

\[W=\max(v_u-t\times l_w,0)-\max(v_u-t\times l_u,0)-\max(v_w-t\times l_w,0) \]

利用恒等式 \(^{*}\)\(\max(x,0)=x-\min(x,0)\) 化简上式,得

\[W=\min(v_u,t\times l_u)-\max(v_w,t\times l_w) \]

那么合并 \(k\) 对这样的水桶,最大收益就是选最大的前 \(k\)\(\min\),最小的前 \(k\)\(\max\)

\(A_i=\min(v_i,t\times l_i)\)\(B_i=\max(v_i,t\times l_i)\),那么最终答案就为

\[\sum_{i=1}^n (B_i - t \cdot l_i) + \max_{k} \left( \sum_{i=1}^k A_{(i)} - \sum_{i=1}^k B_{(n-i+1)} \right) \]

又因为 \(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. 假设每天都选选择1,那么得到基础状态:

    \[\text{基础贡献}=\sum a_i\\ \text{基础代价}=\sum b_i \]

  2. 考虑第 \(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 转移分段,转移方程为

\[dp[i][j]=cost_i+\min \begin{cases} \min_{0\le p\le \lambda} dp[p][j-w_i]+e_i \\ \min_{\lambda < p< i} dp[p][j-w_i] \end{cases} \]

时间复杂度 \(O(n^2W)\),考虑优化。

3. 优化DP

因为 \(x_i > 0\),所以 \(\sum x_j \uparrow\),那么随着 \(i \to n\)\(\lambda\) 也是单增的。分别维护上面分类的两段:

  1. 区间 \([0,\lambda]\) 的最小值:
    维护指针 \(it\),同时随指针的更新同步更新满意度的前缀最小值,支持 \(O(1)\) 查询区间最小

  2. 区间 \([\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),如果规则始终分别引用 xy,而没有把整个坐标当作不可分割的整体,那么就要尝试把 (x,y) 拆成两个维度建图。

这类题有很多共同特征:

  • 一个格子 = 行 + 列(本题)
  • 一个矩形 = 两条横线 + 两条竖线
  • 一个棋盘格 = 黑点 + 白点
  • 一个单词 = 前缀 + 后缀
  • 一个区间 = 左端点 + 右端点

只要发现对象实际上是由两类实体组合而成,并且题目的操作始终围绕这两类实体进行,那么就应该警惕是否能建立一个二分图。

思考方向:
  1. 坐标 (r,c) 是否可以拆成两个独立维度?
  2. 题目的所有操作,是不是都只在操作 rc,而没有依赖格子本身的其他信息?
  3. 如果把每个 (r,c) 看成 rc 之间的一条边,操作会不会变得更简单?
posted @ 2026-09-07 16:26  LYZHaHa  阅读(1)  评论(0)    收藏  举报