loading...

分步转移

分步转移:实际上是一类平衡思想,通过简单的操作使 插入 - 查询 复杂度从 \(\mathcal O(1) -\mathcal O(k^2)\) 变成 \(\mathcal O(k) - \mathcal O(k)\)。(难度系数:提高)

[ARC231A] Two Dimensional Invader

定义 DP,\(f_i\) 表示前 \(i\) 个怪物均被击败的最小代价,把 \(Z_i\) 的贡献挂到最后一起加,转移:

\[f_i \gets f_{j} + (X_i - X_j)^2+(Y_i-Y_j)^2 - Z_i \]

这里出现了分步转移!\(X, Y\) 的值很小,且转移代价只与 \(X_j, Y_j\) 的值有关。

枚举 \(X_j, Y_j\) 查询,复杂度是 \(\mathcal O(V^2)\)。但是插入只有 \(\mathcal O(1)\),这很不好,考虑分步进行,令 \(g_{x, y}\) 表示满足 \(X_j = x\) 的 \(f_j + (y-Y_j)^2\) 的最小值。在 \(j\) 固定时,我们修改 \(g_{x, 1\sim V}\),在 \(i\) 固定时,查询 \(g_{1\sim V,y}\)。复杂度 \(\mathcal O(nV)\)。

一道数据结构题

题意:维护一个多重集合 \(S\),支持插入一个数 \(a\),给定数 \(x\) 查询 \(\{v \mid v \in S \land v \subseteq x\}\) 集合大小。其中 \(v \subseteq x\) 表示 \(v\) 是 \(x\) 的子掩码,即两者按位与的值等于 \(v\)。\(0\le x, v < 2^{20}, n \le 2 \times 10^5\)。

这个题稍微不那么直接,因为需要你自行将 \(2^{20}\) 拆成两个 \(2^{10}\)。把高低位分开,插入时固定低位枚举高位超集,询问时固定高位枚举低位子集,复杂度 \(\mathcal O(n \sqrt V)\)。

posted @ 2026-10-21 19:43  goldspade  阅读(9)  评论(0)    收藏  举报