10.7 模拟赛速记

T1

题意:

有一个无限长数组 \(a\) ,最初 \(a_{0...{n-1}}\) 有值。
最初你在 \(0\) ,你会使 \(j\in [\max{(n,i+1)},i+a_i]\) 的 \(a_j\) 值加 \(1\) ,然后移动到 \(i+1\) 。
\(q\) 次询问,每次给出 \(x\), 求移动到 \(x\) 后 \(a_x\) 的值。
其中最开始的 \(a_i\in [n-1,n+1],i\in [0,n)\) 。我考试时没看到 。

性质?

首先有一个性质是无论何时 \(a_i\) 都是 \(\in [n-1,n+1]\) 。这个很容易发现

需要打表找规律:
把 \(a_{n...∞}\) 每 \(n\) 个一组。

\[\begin{matrix} 7 & 6 & 5 & 5 & 7 & 6\\ 6 & 7 & 5 & 5 & 6 & 7\\ 6 & 6 & 6 & 5 & 6 & 6\\ 7 & 6 & 6 & 5 & 6 & 6\\ 6 & 7 & 6 & 5 & 6 & 6\\ 6 & 6 & 7 & 5 & 6 & 6\\ 6 & 6 & 6 & 6 & 6 & 6\\ 6 & 6 & 6 & 6 & 6 & 6\\ ... \end{matrix} \]

这个规律也很好发现吧。
\(n+1\) 这个值会每次往右移动一格,出去了会停留一轮在回到第一个位置。
遇到 \(n-1\) 就都变成 \(n\) 。
证明是容易的。
这样对于每个 \(n+1\) 用 \(stack\) 求出消失时间,然后就按照规律处理查询就行了。

T2

全篇最简单的题。贪心秒杀。
不过出题人原意不是贪心,是 \(DP\) 。

问题描述

给定 \(L,R\) 和数组 \(a\) 。
可以增大 \(a_i\) , 代价是 \(a_i'-a_i\) 。最终使得对于任意 \(i\) 有:\(L\le a_i+a_{i+1}\le R\)。
求最小代价。
\(n\le 5\times 10^4,L,R\le 10^6\)

贪心

考率 \(a_i,a_{i+1},a_{i+2}\) :
记 \(a_i+a_{i+1}=x,a_{i+1}+a_{i+2}=y\) 。
如果 \(x>R\) 或 \(y>L\) 那么可以直接宣布无解。
如果 \(x<L\) 且 \(y<L\) 那么显然 \(a_{i+1}\) 要加上 \(\min(L-x,L-y)\)
然后如果仍然 \(x<L\),就优先令 \(a_i\) 加上尽可能多的的值,然后才是 \(a_{i+1}\) 加上剩余的值。

DP

朴素设 \(f_{i,j}\) 表示前 \(i\) 项,最后一项调整过后值是 \(j\) 的最小代价。
转移 $O(nR^2) $ 。
由于我们发现 \(i\) 位的值只可能是原值或小于等于 \(L\) 的值。
所以只用枚举到 \(L\) 。
转移 \(O(nL^2)\)
而对于 \(f_{i,x}\) 来说,合法的转移点 \(y\) 一定是一个区间,且打表发现这个区间一定是单调不降的。
所以可以 \(O(nL)\) 解决。
记 \([l_i,r_i]\) 为 \(f_i\) 合法的区间。
由于最终答案在 \(f_{n,l_n}\)
由于对于每个 \(f_{i,j}\) 来说,转移点都是固定的,所以直接倒着递推就行了。

T3

问题描述

给定两棵树:求:

\[\sum_{u,v} dis1_{u,v} \times dis2_{u,v} \]

\(dis1_{u,v}\) 代表第一棵树上 \(u,v\) 之间的距离,\(dis2_{u,v}\) 代表第二棵树上 \(u,v\) 之间的距离。
这不多树问题板子题吗,一眼秒掉。
幸亏暑假集训时提到了一下,导致我下去把这种题搞懂了

sol

在第一棵树上点分治,把当前经过分支中心的点对之间的贡献转化一下,写成:

\[(depth_u+depth_v)\times dis2_{u,v} \]

\(depth_u\) 表示当前分支中心内,点 \(u\) 的深度。
对于某个 \(u\) 把 \(depth_u\) 提出来,就变成了:

\[depth_u\times \sum_{v} dis2_{u,v} \]

也就是求出距离和,这个建虚树+换根 \(DP\) 就行了。
但要注意 \(u,v\),不能同属于分支中心的同一个儿字子树内。
这个容斥一下,先求出总贡献,在减去分支中心的同一个儿字子树内的贡献就行了。

posted @ 2026-10-07 19:32  wlhao  阅读(6)  评论(0)    收藏  举报