2025.7.21 - 7.26

Question 1. 「NOI 2025」机器人

给定一张 \(n\) 个点,\(m\) 条边的有向图 \(G\),第 \(i\) 个点连出 \(d_i\) 条边,其中的第 \(j\) 条边通向点 \(to_{i,j}\),代价为 \(c_{i,j}\),机器人小 R 初始位于点 \(1\),某参数 \(p\) 初始设定为 \(1\),上限为 \(k\)

任意时刻,Controller 可以将参数进行改写:

  • \(p < k\),则可以花费 \(v_p\)\(p\) 改写为 \(p+1\)
  • \(p > 1\),则可以花费 \(w_p\)\(p\) 改写为 \(p-1\)
  • 保证 \(v_p, w_p > 0\)

当小 R 位于点 \(u\),且 \(p\leq d_u\),则可以通过第 \(u\) 个点连出第 \(p\) 条边走向下一个点;否则会卡住走不了。

求小 R 到达每个点要花费的最小代价,代价为经过的所有边的代价与所有改写操作的代价的总和。

\(n,m\leq 3\times 10^5, k\leq 2.5\times 10^5\)


这看起来就很最短路,考虑如何建模。

每个点必须在某个特定参数下才能移动到特定点,这启发我们进行分层,对于第 \(i\) 个点,考虑分出 \((d_i + 1)\) 层,前 \(d_i\) 个点表示 \(p = 1, 2, \cdots, d_i\),最后一个点表示 \(p > d_i\)(记为超限层)。

\(G\) 中的每一个点 \(i\) 中的前 \(d_i\) 层,按照 \(v,w\) 将相邻的层之间进行连边。

\(G\) 中的每一条边,假设从第 \(u\) 个点的第 \(j\) 条边到达点 \(v\),则将点 \(u\) 的第 \(j\) 层向点 \(v\) 的第 \(j\) 层连边,分两种情况:

  • \(j \leq d_v\),直接连即可,代价为原边权。
  • 反之,将点 \(u\) 的第 \(j\) 层连向点 \(v\) 的超限层,代价为原边权;同时再连一条到点 \(v\) 的第 \(d_v\) 层,代价为原边权加上将 \(p\)\(j\) 改到 \(d_v\) 的最小代价。

最终到达某个点的最小代价为该点的所有层的最小代价,认为 \(m,n\) 同阶则时间复杂度大概为 \(\mathcal{O}(m\log_2 m)\)

Question 2. 「NOI 2025」三目运算符

设长度为 \(n(n\ge 3)\)\(01\) 字符串 \(S\) 的变换 \(f(S)\) 为一个长度为 \(n\) 的字符串 \(T\)

\[T_i = \begin{cases} S_i & (i=1,2) \\ S_i & (i\ge 3 \land S_{i-2} = \texttt{0}) \\ S_{i-1} & (i\ge 3 \land S_{i-2} = \texttt{1}) \\ \end{cases} \]

定义操作为 \(S\gets f(S)\),可以证明存在一个最小的非负整数 \(k\) 使得 \(k\) 次操作后 \(S = f(S)\),求出这个最小的 \(k\)

当然,还给出 \(q\) 次操作,每一次操作给出区间 \([l,r]\),表示 \(\forall i\in [l,r]\) 都执行 \(S_i \gets 1 - S_i\),求出操作前与每一次操作后的最小的 \(k\)

多测,\(T\leq 5, n,q\leq 4\times 10^5, \sum n, \sum q\leq 8\times 10^5\)


对操作的性质不够敏感,打个表可以发现如下结论:

Lemma 1

如果存在 \(i\) 使得 \(S_i = S_{i+1} = 1\),则在 \(S = f(S)\) 时一定有 \(\forall j\in [i,n], S_j = 1\)

证明:根据操作,模拟可知每一次会往后多增加一个 \(1\)

Lemma 2

如果存在 \(i\) 使得 \(S_i = S_{i+2} = 1, S_{i+1} = 0\),则依次操作后 \(S_{i+1} = S_{i+2} = 0\)

证明:根据操作,模拟可知显然。

Lemma 3

如果存在 \(i,j (i + 2 < j)\) 使得 \(S_i = S_j = 1\)\(\forall k\in (i,j), S_k = 0\),则 \(S_i\) 影响不到 \(S_j\)

证明:根据操作,模拟可知显然。

Use Them

于是我们可以写出如下的暴力判断法则:

  1. 找出最小的下标 \(i\) 使得 \(S_i = S_{i+1} = 1\)
  2. 找到最小的下标 \(j\) 使得 \(S_j = S_{j+2} = 1\)。如果 \(i\) 不存在,若 \(j\) 存在则 \(k=1\)(原因是需要一次操作使得所有 \(101\) 中后面的 \(1\) 被消除),若 \(j\) 不存在 \(k=0\),结束。
  3. 找到从 \(i\) 开始的连续为 \(1\) 的段的结束位置 \(p\),即 \(\forall k\in [i,p], S_k = 1\)\(S_{p+1} = 0\)
  4. 如果 \(j+2 > i\),则答案为 \(k = n-p\)(原因是这个相当于就是 \(j\ge i\) 往前推了一个,最终按照引理 1 会全部推平),否则答案为 \(k = \max(n-p, 1)\)(原因是可能后面全是 \(1\),但是如果前面有一个 \(101\),就需要多一次操作)。

时间复杂度为 \(\mathcal{O}(nq)\),要优化之,则用线段树直接维护 \(i,j\),可能需要同时维护端点值,端点邻值,区间长度等等信息,同时 \(p\) 使用区间和与线段树二分维护。

每次区间翻转,则对应的修改信息即可,时间复杂度为 \(\mathcal{O}(q\log_2 n)\)

Question 3. Robot Walking

给定 \(n\) 个 checkpoint,第 \(i\) 个 checkpoint 位于 \((x_i,y_i)\) 处,经过一次累计 \(w_i\) 分,多次经过多次累计,保证 checkpoint 的坐标两两不同。

Robot 从 \((1,1)\) 出发,执行 \(q\) 次行动操作,每次行动朝 \(x/y\) 的正/负方向移动 \(k_j\) 格,每次行动起始点的 checkpoint 不累计分数。

求出 \(q\) 次行动累计的得分的总和。

\(n,q\leq 2\times 10^5, x_i,y_i,k_j\in [1,2\times 10^5]\),任意时刻 Robot 的位置满足 \(x,y\in [1,2\times 10^5]\)


每一次相当于需要找到某条水平线段或竖直线段上所有点的权值的总和,对 \(x=1,2,\cdots, 2\times 10^5, y=1,2,\cdots, 2\times 10^5\)vector 之后二分即可。

稍微有一点细节,有四个方向可能代码略长,时间复杂度为 \(\mathcal{O}(q\log_2 n)\)

Question 4. 「ROIR 2024 Day1」表格游戏

给定一个 \(h\times w\) 大小的非负整数矩阵,第 \(i\) 行第 \(j\) 列的值为 \(A_{i,j}\),另外给出一个正整数 \(s\),可以从矩阵中删除若干个整行与若干个整列,使得剩下的元素的和恰好\(s\)

\(h,w\leq 15\)


暴力做法为 \(\mathcal{O}(2^{h+w}hw)\) 其实已经不需要很强的优化了。

可以发现枚举保留的行,仅需要 \(\mathcal{O}(2^h)\),其实还可以乘一个很大的式子。

枚举保留的行后,保留每一列带来的总和已知,记为 \(B_1, B_2,\cdots, B_w\),要求选出其中一些满足总和恰为 \(s\)

背包肯定不行,搜索就回归暴力了,考虑折半搜索即可,时间复杂度为 \(\mathcal{O}(2^{h+0.5w})\)\(\mathcal{O}(2^{h+0.5w}w)\)

Question 5. 「EJOI 2022」Adjacent Pairs

给定一个长度为 \(n\) 的值域为 \([1,n]\) 的正整数序列 \(A\),称序列 \(S\) 满足性质 P 当且仅当 \(\forall 1\leq i < |S|, S_i \ne S_{i+1}\),则序列 \(A\) 满足性质 P。

每一次你可以任意改变序列 \(A\) 中的一项为任意正整数,操作后序列 \(A\) 也应当具有 P 性质。

直至 \(A\) 序列剩下两种不同的元素,求最少需要的操作次数。

\(\sum n\leq 2\times 10^5\)


枚举奇数位置上的元素 \(x\),偶数位置上的元素 \(y\),为了计算答案,记 \(O_i\) 表示奇数位置上 \(i\) 的出现次数,\(E_i\) 表示偶数位置上 \(i\) 的操作次数,则答案至少为 \(n - O_x - E_y\),即所有不是的元素至少需要 \(1\) 次操作。

但是很快就会发现一个问题,假设有一长度为 \(len\) 的段,这个段内所有偶数位置上都是 \(x\),奇数位置上都是 \(y\),则需要额外的次数(操作不同时进行,所以一定会与旁边相同),可以证明最小的额外次数一定是 \(\lfloor{\frac{len}{2}}\rfloor\)

简单证明:把这一段拿出来,下标重新编号为 \(1,2,\cdots,len\),则将所有偶数位置上的元素改为 \(10^9\),然后将所有奇数位置上的数改成需要的,最后将所有偶数位置上的数改成需要的,只要第一步改 \(10^9\) 的元素少了,则根据鸽巢原理一定有相邻的一对数,满足偶数位置为 \(x\) 而奇数位置为 \(y\),卡住了。

所以,设 \(T_{a,b}\) 表示将偶数位置上的 \(a\) 改成 \(b\),奇数位置上的 \(b\) 改成 \(a\) 的最少额外步数,则可以通过双指针扫描所有的 \(X,Y\) 交错连续段求得,原因是必须是连续的一段。

则答案为 \(n - O_a - E_b + T_{a,b}\),考虑如何求出其最小值,分 \(T_{a,b} > 0\)\(T_{a,b} = 0\) 讨论。

\(T_{a,b} > 0\)

由于 \(T_{a,b}\) 进行累加的为若干个仅可能在首尾重合的段,所以这样的 \(a,b\) 只有 \(\mathcal{O}(n)\) 个,为所有的 \((a_{i+1}, a_i)\),暴力计算即可。

一定要分清是 \((a_i,a_{i+1})\) 还是 \((a_{i+1},a_i)\),所以不排除笔者写错的情况。

\(T_{a,b} = 0\)

对于某个特定的 \(a\),若 \(T_{a,b} = 0\),则对于所有出现在偶数位置上的 \(a\),其相邻的元素必定不为 \(b\),对每个 \(a\),称 \(S_a\) 表示所有不行的 \(b\),则答案为 \(n - O_a + \underset{b\notin S_a}{\min} -E_b\)

考虑拿 mapmultiset 维护所有的 \(-E_b\),每次对一个 \(a\) 询问最小值时,先将 \(S_a\) 中所有的 \(b\) 对应的 \(-E_b\) 删除,然后取出最小值,最后再把删除的 \(-E_b\) 加回去即可。

时间复杂度为 \(\mathcal{O}(n\log_2 n)\)

Question 6. 「ROIR 2024 Day1」选择首都

给定一含 \(n\) 个城市的国家,城市间的道路构成树形结构,初始不定首都,对首都 \(r\)\(1,2,\cdots, n\) 号城市回答如下问题:

  • 将原 \(n-1\) 条道路定向为从靠近首都的城市到远离首都的城市。
  • 添加不超过 \(k\) 条有向道路。
  • 记从首都到城市 \(i\) 所经过的最少需要的路径为 \(f_i\),最小化所有 \(f_i\) 的最大值。
  • 求出这个最小值。

\(n\times k\leq 2\times 10^5\)

部分分:仅回答 \(r=1\),含 \(20\%\) 的部分分。


首先考虑 \(r=1\) 的情况,看到这个最大值最小化,直接先考虑二分,假设需要 check 答案为 \(x\)

设计如下贪心:每次找到最深的节点,记为 \(u\),假设其深度为 \(d\),找到 \(d\) 的某个祖先 \(p\),连接 \(r\)\(p\),使得 \(r\to u\) 的最短路变为 \(x\)

\(p\)\(r\)\(x-1\) 级祖先,由“最深”得:\(p\) 的所有子树均已满足条件,最优性可以感性理解。

考虑用线段树维护之,由于每一次的深度相当于是 dfs 序上的区间减,容易用区间加撤销操作,时间复杂度为 \(\mathcal{O}(k\log_2 ^2 n)\)

现已知 \(r=1\) 的答案,接下来考虑换根,假设已知 \(u\) 的答案,要求 \(u\) 的某一子节点 \(v\) 的答案,则依旧可以通过类似做法计算。

根据上述,在换根的同时,我们需要计算:

  • 每个节点的深度,若首都 \(u\to v\),则 \(v\) 子树内的所有点深度 \(-1\),而 \(v\) 子树外的所有点深度 \(+1\),在线段树上,容易用三次区间加减维护与撤销。
  • 换根后的 \(k\) 级祖先,分一点情况讨论,设询问的要求祖先的节点为 \(x\)
    • \(x\)\(v\) 的子树内的节点,则不变。
    • \(v\)\(x\) 的子树内的节点,则需从 \(x\) 向下跳到 \(v\),容易计算出对应的从 \(v\) 向上跳的次数(因为原始深度均已知)。
    • 否则,设 \(p\)\(x,v\) 的 LCA,则先从 \(x\) 向上跳到 \(p\) 再向下跳到 \(v\),综合上述两种做法可以求。
  • 换根后某个点 \(x\) 的子树,也是一样的分情况讨论:
    • \(x\)\(v\) 的子树内,则 \(x\) 的子树不变。
    • \(v\) 不在 \(x\) 的子树内,则 \(x\) 的子树也不变。
    • 否则,令 \(v\)\(x\) 跳一步到 \(w\),则 \(v\) 的子树为除去原 \(w\) 的子树内的所有节点。
    • 综上,也容易用区间加减进行维护与撤销。不理解可以画图参考。

所以再次对每个节点二分,复杂度为 \(\mathcal{O}(nk\log_2^2 n)\),能否再优化?

可以!给出引理:设 \(f_x\)\(r=x\) 的答案,则 \(u\to v\) 满足 \(|f_u - f_v| \leq 1\)

简单证明:让 \(v\)\(u\) 的答案,则最多额外添加 \(v\to u\) 一条边,此时 \(f_v \leq f_u + 1\);同理让 \(u\)\(v\) 的答案类似得到 \(f_u\leq f_v + 1\)

故换根时枚举,省去二分,时间复杂度为 \(\mathcal{O}(nk\log_2 n + k\log_2^2 n)\)

Question 7. [CF2096C] Wonderful City

给定一个 \(n\times n\) 的正整数网格,执行如下操作:

  • 1 i,选中一个未在该类操作中选中的 \(i\),花费 \(r_i\) 的代价,将第 \(i\) 行的所有数增加 \(1\)
  • 2 i,选中一个未在该类操作中选中的 \(i\),花费 \(c_i\) 的代价,将第 \(i\) 列的所有数增加 \(1\)

\(\sum n\leq 1000\)


注意到如下性质,执行一次 1 i 操作后不改变 \(h_{i,j} - h_{i,j+1}\) 的值;同理执行一次 2 i 操作后不改变 \(h_{i,j} - h_{i+1,j}\),而要求的是所有的 \(h_{i,j} - h_{i,j+1}\)\(h_{i,j} - h_{i+1,j}\) 均不能为 \(0\)

所以两类操作是独立的,可以分别考虑。以下仅考虑 1 i 操作。

\(f_{i,0/1}\) 表示考虑完前 \(i\) 行,第 \(i\) 行是否操作,使得前 \(i\) 行没有上下两个元素相同,所花费的最小代价。枚举所有的 \(a_{i,j} - a_{i-1,j}\) 是否存在 \(-1/0/1\),分别考虑四种转移(\((i-1,0/1)\to (i,0/1)\))是否可行,而后进行转移,初始值为 \(f_{1,0} = 0, f_{1,1} = r_1\),终态考虑 \(\min(f_{n,0},f_{n,1})\) 即可。

2 i 操作同理,于是时间复杂度为 \(\mathcal{O}(n^2)\)

Question 8. [CF2112E] Tree Colorings

对于一棵树 \(T\),其有根节点,定义 \(F(T)\) 为满足如下条件的染色方案的数量:

  • 每一个节点为黄色、绿色、蓝色中的一种。
  • 根节点为绿色。
  • 任意蓝色节点 \(u\) 与绿色节点 \(v\) 间的通路上没有黄色节点。
  • 任意黄色节点 \(u'\) 与绿色节点 \(v'\) 间的通路上没有蓝色节点。

求可使得 \(F(T) = m\) 的最小的 \(|T|\)

\(m\leq 5\times 10^5\),一组测试数据内全部输出。


如何求 \(F(T)\)?合理的染色方案肯定是“上面是绿色,下面是蓝色或黄色”,即存在节点的集合 \(S\),使得 \(\forall u\in S\),使得 \(u\) 为根的子树为全黄或全蓝。

\(f_{u,0/1/2}\) 表示以 \(u\) 为根下的子树的染色方案,且 \(u\) 染绿色/黄色/蓝色。

\(f_{u,1}\)\(f_{u,2}\) 只能从其子节点 \(v\)\(f_{v,1}\)\(f_{v,2}\) 对应转移,其中各子树独立,所以是乘法。

但是 \(f_{u,0}\) 可以从其子节点 \(v\) 的任意染色转移,即可以以 \(f_{v,0} + f_{v,1} + f_{v,2}\) 转移。

显然,\(f_{u,1} = f_{u,2} = 1\),即全部颜色相同,令 \(g_u = f_{u,0}\),则 \(g_u = \underset{v\in s(u)}{\prod} (g_v + 2)\)

分析一下,\(g_i\) 的起始值为 \(1\),所以乘出来全部是奇数,故 \(m\) 为偶数无解。

\(h_t\) 表示 \(F(T) = t\) 的最小的 \(|T|\),转移的要求是把 \(t\) 拆成一堆数的乘积,故转移为枚举 \(t\) 的约数 \(p\),然后有 \(h_t\gets h_{t/p} + h_{p-2}\),其中 \(\gets\) 为尝试更新。

时间复杂度为 \(\mathcal{O}(m\ln m)\)

Question 9. 「POI 2013」LUK-Triumphal arch

给定一棵 \(n\) 个节点的树,Suzune 位于 \(1\) 号节点上,Kaho 有给节点染黑的能力,初始树上仅 \(1\) 号节点为黑,其余所有节点全部为白色。

每一轮按照如下顺序执行:

  1. Kaho 选择 \(k\) 个节点将其全部染成黑色。
  2. Suzune 选择一个相邻的节点并移动至该节点。

任意时刻,Suzune 走至白色节点上,则 Suzune 胜;否则当树上所有节点全部染成黑色,Kaho 胜。

为了使得 Kaho 胜,求出最小的 \(k\)

\(n\leq 3\times 10^5\)


首先进行一个注意力观察,若 \(k = K\) 可以胜利,则 \(k = K+1\) 总是能胜利,方案为每次多出来的节点染根节点,其余保持不变的策略即可。

故单调性成立,考虑二分最小的 \(k\),现 check \(k = K\) 时是否可行。显然,\(K \ge d_1\),其中 \(d_i\) 表示以 \(1\) 为根时点 \(i\) 的儿子数。

可以发现一个引理,就是 Suzune 不会走回头路,Suzune 一定会一路向下,否则会给 Kaho 一次染色机会而降低自己获胜的可能。

假设某个点向下连出的点少于 \(K\),则剩下的染色的点可以染子树中的点,从而弥补需求。

故设 \(f_u\) 表示在 Suzune 位于节点 \(u\) 上,且 \(u\) 为默认黑色,则最少需要预先在子树染色的节点的数量。

考虑转移,不考虑与 \(u\) 直接相连的部分,则有 $ \underset{v\in s(u)}{\sum} f_v$ 个节点需要预先染色,如果不染完这些所有的预先要求的点,Suzune 就可以尝试往没有染完的方向走,这样就不可能保证 Kaho 的必胜状态了。

上述式子中 \(s(u)\) 表示 \(u\) 的儿子的集合,依定义有 \(|s(u)| = d_u\)

冗余的次数为 \(K - d_u\),所以 DP 转移式为 \(f_u = \max(0, K - d_u + \underset{v\in s(u)}{\sum} f_v)\),则 check 成功当且仅当 \(f_1 = 0\)

时间复杂度为 \(\mathcal{O}(n\log_2 n)\),问题得以解决。

Question 10. [AGC013E] Placing Squares

给定一个长度为 \(n\) 的木板,等长度标刻度 \(1,2,\cdots, n-1\) 对木板 \(n\) 等分。

\(m\) 个标记刻度 \(x_1,x_2,\cdots, x_m\)

现在在木板上若干个正方形木块,要求:

  • 木块首尾相接,边紧贴木板,刚好覆盖完整块木板。
  • 木块的边长为整数个刻度。
  • 木块与木块的交界处所对应的刻度不能是标记刻度。

对于某种放置方案,其权值为所有木块的面积的乘积,求所有可能的放置方案的权值总和。

\(n\leq 10^9, m\leq 10^5\)


\(f_i\) 表示覆盖到第 \(i\) 刻度的答案,令开始和结尾分别为第 \(0\) 与第 \(n\) 刻度,则转移为 \(f_i = \overset{i-1}{\underset{j=0}{\sum}} f_j (i-j)^2\)

含义是提出当前的最后一段,乘上对应的前面的权值总和求总和。

如果 \(i\) 是标记刻度,转移后令 \(f_i\) 强制改为 \(0\) 即可,考虑如何优化。

\[\begin{aligned} f_i &= \overset{i-1}{\underset{j=0}{\sum}} f_j(i-j)^2 \\ f_{i+1} &= \overset{i}{\underset{j=0}{\sum}} f_j(i + 1-j)^2 \\ &= f_i+ \overset{i-1}{\underset{j=0}{\sum}} f_j(i + 1-j)^2 \\ &= f_i+ \overset{i-1}{\underset{j=0}{\sum}} f_j(i-j)^2 + 2 \overset{i-1}{\underset{j=0}{\sum}} f_j(i-j) + \overset{i-1}{\underset{j=0}{\sum}} f_j\\ &= f_i + A_i + 2 B_i + C_i\\ \end{aligned} \]

如果 \(f_i\) 没有被强制清零,则 \(A_i = f_i\),则 \(A_i\) 递推式已知。

\[\begin{aligned} B_{i+1} &= \overset{i}{\underset{j=0}{\sum}} f_j(i+1-j) \\ &= f_i + \overset{i-1}{\underset{j=0}{\sum}} f_j(i+1-j) \\ &= f_i + \overset{i-1}{\underset{j=0}{\sum}} f_j(i-j) + \overset{i-1}{\underset{j=0}{\sum}} f_j\\ &= f_i + B_i + C_i\\ C_{i+1} &= \overset{i}{\underset{j=0}{\sum}} f_j\\ &= f_i + \overset{i-1}{\underset{j=0}{\sum}} f_j\\ &= f_i + C_i\\ \end{aligned} \]

所以当没有遇到标记刻度的时候有:

\[\begin{cases} A_{i+1} = 2A_i + 2B_i + C_i\\ B_{i+1} = A_i + B_i + C_i\\ C_{i+1} = A_i + C_i \end{cases} \]

列出转移矩阵,做矩阵快速幂。

如果遇到标记刻度时,同理则有:

\[\begin{cases} A_{i+1} = A_i + 2B_i + C_i\\ B_{i+1} = B_i + C_i\\ C_{i+1} = C_i \end{cases} \]

类似地做矩阵快速幂即可,时间复杂度为 \(\mathcal{O}(T^3m\log_2 n)\),其中 \(T = 3\)

Question 11. 「JOISC 2025 Day1」比太郎之旅 2

给定一个 \(n\times m\) 的山峰群,位置 \((i,j)\) 的山峰的海拔为 \(H_{i,j}\),著名角色 Bitaro 有一个基于参数 \(L\) 的技能:

  • 假设他当前在某个海拔为 \(x\) 的山顶上,可以跳到高度为 \(x + L + 0.5\),随后上下左右随便移动,只要移动在山峰群内部且不会撞到某座山上(即某座山的海拔高于当前高度),最后落在某座山的山顶上。

求解 \(q\) 个问题,从位置 \((a_i, b_i)\) 的山峰的山顶移动到位置 \((c_i,d_i)\) 的山峰的山顶的最少的技能使用次数。

\(n,m,q\leq 3\times 10^5\)


使用技能的次数最小化,至少需要满足:最少需要达到的高度最小化,可以使用并查集维护最小生成树后进行树上链 max 查询,后面的问题可以倍增做。

同时还需要满足:每一次落点都尽可能高,这个也可以类似的做,按照高度从小到大考虑的时候,当考虑高度为 \(H\) 的时候,用另一个并查集,先合并到高度为 \(H+L\) 的点,然后查询连通块高度的 max 对应的点即可。

发现,后面的每一次的落点也可以倍增做,具体来说,可以维护 \(g_{i,j}\) 表示从某个点 \(i\)\(2^j\) 步会到达哪一个点。

最后查询就容易了,通过倍增,确定要达到的目标高度,确定最少需要的次数,可以在线做,时间复杂度为 \(\mathcal{O}((HW+Q)\log_2 (HW))\)

Question 12. 「CCPC2022 广州站」A.Alice and Her Lost Cat

给定一棵 \(n\) 个节点的树,以 \(1\) 为根,一只小猫从根以最短路走到某个叶子,每个节点上有监控,你可以执行如下操作:

  1. 开启某个节点 \(i\) 的监控,需要花费 \(a_i\) 的代价,检查小猫是否经过节点 \(i\),如果经过,可以得知小猫在该节点之后的一步的去向。该操作可以执行若干次。
  2. 选择一个叶子节点的集合 \(S\),搜查 \(S\) 内是否有小猫,需要花费 \(t_{|S|}\) 的代价。该操作只能执行至多一次。

\(n\leq 5000, t_i\leq t_{i+1}\)


设出 \(f_{i,j}\) 表示以 \(i\) 为根的子树下有 \(j\) 个要用操作 2 的叶子节点,该 DP 难以转移。

改为设 \(f_{i,j,0/1}\) 表示:以 \(i\) 为根的子树下,有 \(j\) 个叶子节点没有确定,是否存在一个叶子节点,通过开启祖先的监控来确定。

只要有一个节点 \(w\) 开启了监控并确定有猫,那么 \(w\) 子树内有一个叶子可以不需要搜查。

假设要求 \(f_{u,k,0/1}\),如果 \(u\) 不开监控,则:

\[f_{u,k,0} = \underset{\sum k_i = k}{\min} \{\sum f_{v,k_i,0} \} \]

同时,因为 \(u\) 不开监控,而 \(u\) 的祖先无法区分 \(u\) 的不同儿子,所以 \(f_{u,k,1}\) 当且仅当恰有一个子树 \(v\) 使得 \(f_{v,k_i,1}\) 取到,则:

\[f_{u,k,1} = \underset{\sum k_i = k, \sum o_i = 1}{\min} \{\sum f_{v,k_i,o_i} \} \]

如果 \(u\) 开监控,那么 \(u\) 的所有儿子的需求均被解决。

\[f_{u,k,0} = a_u + \underset{\sum k_i = k}{\min} \{\sum \min(f_{v,k_i,0}, f_{v,k_i,1}) \} \]

假设 \(u\) 是叶子,则:

\[\begin{cases} f_{u,0,0} = a_u\\ f_{u,0,1} = 0 & (\text{Wait for Ancestor}) \\ f_{u,1,0} = 0 & (\text{Wait for OP2}) \\ f_{u,1,1} = +\infty \end{cases} \]

求答案的时候,由根节点可以通过不开监控确定叶子节点有猫,其余节点已经通过各种方式确定,故可以直接视作一个代价为 \(0\) 的,位于节点 \(0\) 的监控。

树上背包 DP 即可,时间复杂度为 \(\mathcal{O}(n^2)\)

Question 13. 「THUSC 2015」平方运算

给定一个长度为 \(n\) 的非负整数序列,执行如下 \(m\) 个操作:

  • 1 l r,表示在模 \(P\) 意义下令 \(\forall i\in [l,r], a_i\gets a_i^2\)
  • 2 l r,表示求 \(\sum_{i\in [l,r]} a_i\) 的值。

\(n,m\leq 10^5, P\in \{233,2332,5,8192,23,45,37,4185,5850,2975,2542,2015,2003,2010,4593,4562,1034,5831,9905,9977\}\)


打表可知,当 \(P\) 取这些特定的数时,操作 \(1\) 得到的数字容易进入循环节,平均不超过 \(12\) 步可以进入循环,环长的 LCA 不超过 \(60\)

那么我们就有一个很好的做法:

  • 每个元素先暴力执行 \(12\) 次,然后用循环节进行维护。
  • 于是可以开两棵线段树 \(S_1,S_2\)
    • \(S_1\) 用于维护目前还没有进入循环的元素,剩余的步数与这些元素的区间和。
    • \(S_2\) 用于维护在循环节内的元素,每个区间的循环节的和,目前在循环节中的位置,以及元素的区间和。
    • 每次在 \(S_1\) 上递归,如果当前该区间有剩余的未进入循环节的元素,暴力递归进子区间;否则在 \(S_2\) 上操作即可。

时间复杂度是正确的。

posted @ 2025-07-19 10:13  ydzr00000  阅读(12)  评论(0)    收藏  举报