2026/07/25 赛后总结

解题报告分析 4

总结遇到的问题与题目中一些神奇的思维点。

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

Write Date:7/23/2026

T1 String

一个比较显然的贪心,先考虑 S 作为 T 的一个前缀存在,测一下大样例发现有问题,于是引出第二种情况,直接保留后面的一个比当前位小的字符。用常规方式与处理一下出现位置即可,有几个 26 倍的常数。

T2 LIS

首先,把伪代码实现出来,把样例二的生成序列跑出来。

赛上想法:打表不难发现生成序列是一个 \(\min_{i=1}^{n}a_i\)\(\max_{i=1}^{n}a_i\) 的一个排列,而且看起来生成的大小似乎是一堆短单调递增段循环拼起来的。再观察一下,好像最终答案都是最后一部分单调递增的加上前面一些,但有点段取一个,有的段取两个的。。。好像找不到什么规律啊,而且 \(a_i\le 10^{18}\) 很难有什么启发性的想法。于是就跳过了。

要点1:通过函数生成序列且序列长度已知,那 while() 最多执行多少次?

$\Longrightarrow $ 生成代码中核心的添加元素部分:

if (S[I] + 1 != S[I + 1]) {
    B1.push_back((S[I] + S[I + 1]) / 2);
}

每次去两个位置的平均数,不妨画一下生成过程,可以画生成结构树 \(^{*}\)(好吧,前面几天做组合的时候天天想着画这个东西,结果今天就没想到)。手摸一下样例:

发现最终序列等于原序列加上生成树中每一层的序列,同时生成树是一片BST森林。那么显然,生成循环至多运行 \(\log N\) 次。

要点2:如何利用上一步分析得到的结果?

\(\Longrightarrow\) 再次手摸样例,发现会取完某一层,于是想一下,最优情况应该就是每次取一层的连续的若干个,然后今日下一层。不妨考虑构造DP

定义 \(dp[i][j]\) 表示在第 \(i\) 给间隔处的生成树的第 \(j\)末尾的答案。每棵树的第0层为右边的点。有转移:

\[dp[i][j]=\max_{k=0}^{j}\{dp[i-1][k]+\text{LIS}(i,k,j) \} \]

其中 \(\text{LIS}(i,k,j)\) 表示第 \(i\) 颗树从第 \(k\) 层到第 \(j\) 层的 LIS。

考虑最后两层的转移情况,由于排除最后一层上面部分是一颗满二叉树,在特殊性质 B 不满足的情况下,最后一层会出现最左边没有左儿子的情况。此时有两种转移方案:

  1. 从倒数第二层最后一个走下来
  2. 从倒数第二层第一个可以下行的地方下来

分类讨论即可。

感觉还是很神奇,似乎没有什么很有效的方式推导出完整的逻辑链条,燃尽了。

T3 Wall

以下内容由 Deepseek 生成,由于题解区的题解几乎都一样,而且表述或多或少存在问题,遂决定让 DS 生成一篇题解。

将题目已经给出的形式化内容进一步完善,得到:

\[\sum_{i=1}^{n}(H_i-h_i)=\sum_{i=1}^{n}(\min(L_i,R_i)-h_i) \]

其中,\(L_i=\max_{j=1}^{i}h_j\)\(R_i=\max_{j=i}^{n}h_j\),考虑枚举当前积水深度 \(y\),有

\[\sum_{i=1}^{n}(\min(L_i,R_i)-h_i)=\sum_{i=1}^{n}\sum_{y=1}^{\infty}([\min(L_i,R_i)\ge y]-[h_i\ge y]) \]

那么对于每一个深度 \(y\),只需要计算左右都有大于等于 \(y\) 的墙且当前位置小于等于 \(y\) 的位置个数和

\(C(y)\) 为该层贡献(即对高度区间长为 \(\Delta y\) 时乘上 \(\Delta y\)),则

\[\text{answer} = \sum_{y\ge 1} C(y). \]

考虑如何计算每一层的贡献。

由于 $$a_i,b_i$$ 取值可能很大($$\le 10^9$$),但只有 $$2n$$ 个关键值。当 $$y$$ 从大到小下降时,每个位置 $$i$$ 的“状态”仅在这些关键值处改变。

对固定的 $$y$$,定义每个墙的选择数:

  • \[d_i =$$ 满足 $$h_i < y$$ 的选择数(0, 1, 2); \]

初始时 $$y > \max{a_i,b_i}$$,所有 $$d_i=2$$。当 $$y$$ 越过某个墙的较大值($$\max(a_i,b_i)$$)时,该墙的 $$d_i$$ 从 2 变为 1(乘 $$\frac12$$);越过较小值($$\min(a_i,b_i)$$)时,$$d_i$$ 从 1 变为 0(乘 0);若两值相等,则直接从 2 变为 0。因此 $$d_i$$ 随着 $$y$$ 降低只会减小,且每次乘以 $$\frac12$$ 或 0。

这是我们发现,对固定的 $$y$$ 与位置 $$i$$,我们关心的事件是:

\[E_i(y):\ \min(L_i,R_i)\ge y\ \land\ h_i<y \]

用计数表示:所有 $$2^n$$ 个序列中,满足该事件的序列数记为 $$\text{valid}_i(y) - \text{self}_i(y)$$,其中

\[\text{valid}_i(y) =$$ 满足 $$\min(L_i,R_i)\ge y$$ 的序列数, $$\text{self}_i(y) =$$ 满足 $$h_i\ge y$$ 的序列数(此时必然有 $$\min(L_i,R_i)\ge y$$)。 **计算 $$\text{self}_i$$:** 第 $$i$$ 个墙有 $$c_i$$ 种选择使 $$h_i\ge y$$,其余 $$n-1$$ 个墙任选,故 \]

\text{self}_i(y) = c_i \cdot 2^{n-1}.

\[**计算 $$\text{valid}_i$$:** 条件 $$\min(L_i,R_i)\ge y$$ 等价于:前缀 $$[1,i]$$ 至少有一个 $$\ge y$$,且后缀 $$[i,n]$$ 至少有一个 $$\ge y$$。 用容斥: \]

\begin{aligned}
\text{valid}i(y) &= \text{总数} - P_i - Q_i + \text{全部}<y \
&= 2^n - \Big(\prod
^i d_j\cdot 2^{n-i}\Big) - \Big(2{i-1}\prod_{j=i}n d_j\Big) + \prod_{j=1}^n d_j.
\end{aligned}

\[ 其中: - $$P_i$$:前缀 $$[1,i]$$ 全 $$<y$$,后缀任意; - $$Q_i$$:后缀 $$[i,n]$$ 全 $$<y$$,前缀任意; - 两项的交集“全体 $$<y$$”就是 $$\prod_{j=1}^n d_j$$。 **层贡献** $$C(y) = \sum_{i=1}^n \big(\text{valid}_i(y) - \text{self}_i(y)\big)$$。 将上述表达式代入并求和: \]

\begin{aligned}
\sum_{i=1}^n \text{valid}i &= n2^n - \sum^n \Big(\prod_{j=1}^i d_j\cdot 2^{n-i}\Big) - \sum_{i=1}^n \Big(2{i-1}\prod_{j=i}n d_j\Big) + n\prod_{j=1}^n d_j, \
\sum_{i=1}^n \text{self}_i &= 2{n-1}\sum_{i=1}n c_i = 2{n-1}\sum_{i=1}n (2-d_i) = n2^n - 2{n-1}\sum_{i=1}n d_i.
\end{aligned}

\[相减得到极简洁的形式: \]

\boxed{C(y) = 2^{n-1} \sum_{i=1}^n d_i ;-; \sum_{i=1}^n \Big(\prod_{j=1}^i d_j\cdot 2^{n-i}\Big) ;-; \sum_{i=1}^n \Big(2{i-1}\prod_{j=i}n d_j\Big) ;+; n\prod_{j=1}^n d_j}.

\[记: - $$S_1 = \sum_{i=1}^n d_i\]

  • \[T_2[i] = 2^{n-i}\prod_{j=1}^i d_j$$,求和 $$S_2 = \sum_i T_2[i] \]

  • \[T_3[i] = 2^{i-1}\prod_{j=i}^n d_j$$,求和 $$S_3 = \sum_i T_3[i] \]

  • \[S_4 = \prod_{j=1}^n d_j \]

则 $$C(y) = 2^{n-1}S_1 - S_2 - S_3 + n S_4$$。

这就是每一层高度对答案的贡献。不同 $$y$$ 区间的贡献只需乘上区间长度。

posted @ 2026-09-07 16:27  LYZHaHa  阅读(2)  评论(0)    收藏  举报