杂题选做(Ⅲ)

CF786C(*2400)

根号分治。可以发现这个答案和调和级数有点关系的。答案个数是 $\sqrt n$ 级别的。

若 $k \leqslant \sqrt n$,直接 $O(n)$ 计算。

若 $k > \sqrt n$,二分出有多少个数与该数答案相同。这样时间复杂度 $O(\log n)$。

总共是 $O(n \sqrt n + n \sqrt n\log n)$。

CF1923D(*1800)

$n \leqslant 3 \times 10 ^ 5$,所以只能 $O(n)$ 或 $O(n \log n)$ 了。

发现对于一段连续的区间,若最终可以合为一个史莱姆,那么只需满足其有 $\geqslant 2$ 种不同的数。这是因为至少其中一个最大的数一定和至少一个小于它的数相邻,于是这样较大数可以将它吃掉。然后这个大数就变成唯一一个最大的数了,于是可以由它吃掉其它所有的。

于是对于每个位置 $i$,只需算出它到左/右的第一个与它左/右边相邻的那个数不同的与 $i$ 的距离与第一个满足从该位置到左/右的前/后缀使得其和 $> a_i$。
特判:当与 $a_i$ 相邻的数(不妨令为 $a_{i - 1}$) $> a_i$ 时,这时 $[i - 1, i - 1]$ 已经可以将其消除了,而这时第一个与 $a_{i - 1}$ 不同的数可能距离 $a_i$ 很远。

CF1920D(*1900)

总操作次数不超过 $10 ^ 5$。
最多查询到 $10 ^ {18}$ 即操作 $2$ 的次数超过 $\lfloor 10 ^ {18} \rfloor = 60$。

于是可以考虑根据当前的 $2$ 操作存下来到下一个 $2$ 每个 $1$ 操作所修改的数以及当前 $2$ 操作后串的长度,查询时若 $k$ 在两个 $2$ 操作之间(即该位置由 $1$ 操作直接带来),那么直接输出答案即可。否则相当于 $k < $ 上一个串的长度,于是除掉 $2$ 操作所乘的数,对这个值取模再继续即可。时间复杂度 $O(n\log k)$,可以通过本题。

CF1909D(*1900)

特殊性质题。首先看到这个 $k$ 很不顺眼。于是想到将每一项都减掉一个 $k$,将式子转化为 $x - k = (y - k) + (z - k)$,于是发现可以将每个数减去 $k$,这样就转化为 $x = y + z$。即总和与个数乘上 $k$ 的差值不变。但是可以发现,有些情况不合。当序列中存在 $>= k$ 以及 $<= k$(只存在 $= k$ 的可以),这时不合。因为在 $x$ 转化为 $y, z$ 时,若 $x \leqslant k$,则 $y + z \leqslant 2k$,于是必有 $y / z \leqslant k$。反之亦然。于是显然这时无法做到整个序列中的数最后与 $k$ 的差符号相同,即不合。

CF1902D(*1900)

可以将每次询问拆成三个部分。

$[1, l - 1]$,$[l, r - 1]$,$[r, n]$。

发现 $1$ 和 $3$ 不被修改影响可以直接求出,而 $2$ 被修改影响。不妨令答案在 $2$ 中为 $k$,并且令操作完 $1$ ~ $i$ 所总共带来的影响这个前缀是 $a_i$,则 $(x, y) = a_{l - 1} + a_r - a_k$,其中 $l \leqslant k \leqslant r - 1$,移项得 $a_k = a_{l - 1} + a_r - (x, y)$,于是只需要开一个 $map$ 记录一个前缀 $a$ 出现的位置即可。

时间复杂度 $O(q\log n)$。

CF1901D(*1700)

小清新贪心题

若将 $i$ 选作起始点,则对于 $j$:
$1\leqslant j < i$ : 此时 $x \geqslant a_j + n - j$。

$j = i$ : 此时 $x \geqslant a_i$。

$i < j \leqslant n$ : 此时 $x \geqslant a_j + j - 1$。

预处理 $t_i = \max\limits_{j = 1} ^ {i} (a_j + n - j), s_i = \max\limits_{j = i} ^ {n} (a_j + j - 1)$ 于是答案为 $\min\limits_{i = 1}^{n}(a_i, t_{i - 1}, s_{i + 1})$。

CF1898E(*2200)

考虑什么时候无法满足条件。若有在 $t$ 中有一组 $i, j$ 使得 $i < j, t_i > t_j, p_{t_i} < p_{s_i}$,则不合法。于是可以考虑倒序枚举 $t$ 中的元素,将其与 $s$ 中的配对。且对于一个 $t$ 中的字符 $i$,$i + 1 \sim 'z'$ 中最小值之后的都不可以选取。若没有符合条件的字符,即不合题意。

CF1895D(*1900)

很容易发现只要定了 $b_1$,那么后面的数全都定了。于是想到处理出 $a_i$ 的异或前缀和 $sum_i$,则 $sum_i$ 互不相同。但是不太好继续贪心算最优解。而发现,由于 $sum_i$ 互不相同,$b_i$ 也互不相同。于是只需要将 $b_i$ 的总和取最小值,则此时就是答案。这时只需要看对于每一位,$sum$ 当中是否有 $1$ 的多,若是,则让 $b_1$ 选取该二进制异或位,否则不选。

CF1893B(*1700)

水题。容易看出,显然要将数组 $B$ 从大到小排序。由于新序列的 $LIS$ 显然 $\geqslant$ 原序列的 $LIS$,于是考虑一种贪心:当 $a_i \leqslant b_j$ 时,将 $b_j$ 插在 $a_i$ 前面。这样最后剩下来的一定很小且在最后,显然为最优解。

CF1889B(*1700)

已经是近半年前做的了啊。现在感觉也不是很难想啊。

容易发现,对于两个连通块,显然是将编号最小的两个点相连。于是从 $1$ 开始考虑,看它连接的点的编号。假如 $1$ 和 $i$ 能够连接,那么直接连接。否则这个点一定可以在某个时刻与一个点 $j$ 相连。于是可以列得 $S_i + S_j \geqslant i \times j \times c$,已以及 $S_1 + S_i < i \times c$。

两式相减得 $S_j - S_1 \geqslant i \times c \times (j - 1) = (i \times j - i) \times c$. 而 $i \times j - i - j \geqslant (i - 1) \times (j - 1) - 1 \geqslant (2 - 1) \times (3 - 1) - 1 = 1$,所以 $i \times j - i \geqslant j$,即 $S_j - S_1 \geqslant (i \times j - i) \times c \geqslant j \times c$. 于是显然 $S_j + S_1 \geqslant j \times c$. 即 $j$ 和 $1$ 可以连边。而 $i, j$ 可以连边,由于 $1, j$ 在一个联通块内且 $i < j$,于是 $1, i$ 也可以连边。

所以假如最终可以构成一个连通块,那么所有的点都可以与 $1$ 相连。能相连的条件条件是 $a_i + S_1 \geqslant i \times c$,于是将 $i \times c - a_i$ 从小到大排序,要是枚举到某次无法选取即不合法,否则合法。

CF1129B(*2000)

就让答案长度为 $2000$。

考虑状态为 $0, 0, \cdots, -x, x + d$ 的数组。此时 $Alice$ 算出来的答案为 $x + d$,而正解是 $2000d$。

此时差是 $1999d - x$. 若要 $1999d = x + k$. 则 $d = \frac{x + k}{1999}$,就让 $x = 1999 - k \% 1999$。

或者说,令最后两个数为 $-d + \frac{k + d}{2000}, d$,这里 $d = 200000 - (k \% 2000)$. 因为要让 $-d + \frac{k + d}{2000} < 0$,所以 $d$ 得足够大。

AT_abc359_f(*1792)

每次合并一个点到树里面去肯定是选代价小的。先让每个点的度数为 $1$,相当于已经使总度数为 $n$(总共需要 $2 n - 2$). 然后选择一个点作为顶点拉一个没被合并过的点,新节点直接加在它下面。操作 $n - 2$ 次,每次合并后直接变成下一次合并该点需要的差值。

CF1775E(*2100)

妙妙题。

开始不好考虑。再想想维护前缀,那么一次操作就可以是对很多段 $-1$ 或 $+1$ (每次只能为其中一种),所以就是最大减最小最终的的数。注意最大最小同正负的情况。

CF1982E(*2300)

这玩意儿原来可以考虑分治,$dfs(l, r, k)$ 代表 $[l, r]$ 中二进制 $1$ 的个数 $\leqslant k$ 的个数。

则 $dfs(0, n - 1, k) = dfs(0, \frac{n - 1}{2}, k) + dfs(\frac{n - 1}{2} + 1, n - 1, k)$,但这样时间复杂度完全不能接受。于是根据二进制 $1$ 个数这个性质优化。

$dfs(0, n - 1, k) = dfs(l, 2 ^ t - 1, k) + dfs(2 ^ t, n - 1, k)$,其中 $t$ 是 $n - 1$ 的二进制下最高位。

$dfs(0, n - 1, k) = dfs(0, 2 ^ t - 1, k) + dfs(2 ^ t, r, k) = dfs(0, 2 ^ t - 1, k) + dfs(0, r - 2 ^ t, k - 1)$。

这样可以预处理出来 $dfs(0, 2 ^ t - 1, k)$,用 $dp[t][k]$ 维护,剩下的由于 $k$ 每次操作都递减,就是 $O(k)$。

所以这里总时间复杂度为 $O(Tk + \log^ 2 n)$,可以通过本题。

对于 $dfs$ 这里的加法运算,搞个东西维护区间最长的左边都满足的个数,右边都满足的个数,答案,区间长度,加法就类似线段树里的 $pushup$ 那个东西,很容易就结束了。

AT_arc178_c(*1990)

让 $b$ 数组直接递增好了。这样绝对值可以拆掉了。
$$
\sum\limits_{i = 1} ^ {L - 1} \sum\limits_{j = i + 1} ^ {L} (B_j - B_i) = \sum\limits_{i = 1} ^ {L - 1} i \times (L - i) \times (B_{i + 1} - B_i)
$$
这下直接无限背包了。第 $i$ 个物品重量为 $i \times (L - i)$,然后物品最大值 $B_L$ 就是总物品的个数(每次取的是 $B_{i + 1} - B_i$ 这个差分这么多的物品)。

时间复杂度大约 $O(L\sqrt L)$,可以通过本题。

CF1762D(*2100)

妙妙交互题。

$2n$ 次交互那可以往询问两次淘汰掉一个数这里想。

对于 $x, y, z$,询问 $\gcd(x, y), \gcd(x, z)$.

$\gcd(x, y) = \gcd(x, z)$. 此时 $x$ 位置一定不能是 $0$,否则 $y = z$ 矛盾。
$\gcd(x, y) < \gcd(x, z)$. 此时 $y$ 位置一定不能是 $0$,否则前者是 $x$ 而后者 $\gcd(x, z) \mid x$。
$\gcd(x, y) > \gcd(x, z)$. 此时 $z$ 位置一定不能是 $0$,否则后者是 $x$ 而前者 $\gcd(x, y) \mid x$。

询问次数 $2 \times (n - 2)$,可以通过。

P6287

容易猜到,答案跟 $1$ 出现的个数和位置有关。若没有 $1$,答案就是最小的点权。否则容易证明肯定不会选权值为 $3$ 的点权或者 $\geqslant 2$ 个点权为 $2$ 的点。于是这样就有 $2$ 种情况。纯 $1$ 的路径,或者有 $1$ 个 $2$,剩下的都是 $1$ 的路径。

树型 DP 即可,时间复杂度 $O(n)$。

P11189

考虑每个点到其父亲节点的差分值 $cf_i = a_i - a_{fa_i}$,那么每个 $2$ 操作是把与路径相邻的节点差分值减 $1$ 且操作次数 $\leqslant a_1$。

只需要用 $dp_u$ 记录 $i$ 子树内最多操作多少次以保证 $v$ 属于子树 $u$,$cf_v\geqslant 0$,设 $u$ 的儿子子树内操作次数是 $v_1, v_2, \cdots, v_k$。

那么需要满足的条件是 $v_i \geqslant \sum\limits_{j = 1, j \neq i} ^ {k} v_j$,所以 $v_i \in[\max(0, \sum\limits_{j = 1, j \neq i} ^ {n} v_j), f_{v_j}]$。

这时可以二分 $\sum\limits_{i = 1} ^ {k} v_i$,然后分配。然后算出 $\sum\limits_{i = 1} ^ {k} v_i$ 是否在可算出的最小值和最大值之间即可。

若根节点可操作的次数 $\geqslant a_1$,那么答案是肯定的。否则无论如何进行操作 $1$ 都没法增加。时间复杂度 $O(Tn\log V)$。

CF425E(*2500)

考虑 $dp_{i, j, k}$ 表示,前 $i$ 个数,右端点限制在 $i$ 以前,布置了 $j$ 条线段,有用的有 $k$ 条。

于是对于 $k - 1 \to k$ 的转移,设为下一个选择线段右端点 $r$,于是则相当于,对于取到右端点 $r$ 的,有 $2 ^ {r - i} - 1$ 种选法,然后右端点在 $[i + 1, r]$ 之间,左端点在 $[1, i]$ 之间的,这样有 $2 ^ {i \times (r - i)}$ 种,时间复杂度 $O(n ^ 3)$。

CF93E(*2600)

考虑设计一个 DP。$dp_{i, j}$ 表示,$[1, i]$ 中,至少被前 $j$ 个武器参数中一个整除的数的个数。于是可得到,$dp_{i, j} = \lfloor \frac{i}{a_j}\rfloor + dp_{i, j - 1} - dp_{\frac{i}{a_j}, j - 1}$,但这样 $i$ 这位空间复杂度太大了,考虑优化。

发现可以用记忆化搜索,而这样第一维 $i$ 的空间复杂度只需要 $\sqrt n$ 个,后一维需要 $k$,这样空间复杂度 $O(k \sqrt n)$。还是爆掉,于是想出设一个阈值 $T$,设成 $\sqrt{k\sqrt n}$ 最好,然后预处理出 $dp_{i, j} (1 \leqslant i \leqslant T, 1 \leqslant j \leqslant k)$,时间复杂度 $O(k\sqrt n)$。

事实上,还可以把数组在进入记忆化搜索之前从大到小排序来卡常。

CF1371F(*2800)

直接上线段树,维护 `>><<<` 这种出现多少。代码是真的实在难写。时间复杂度 $O(q\log n)$。

CF79D(*2800)

发现 $k$ 的值很小。于是想到状压 DP。

再者就是翻转一段相当于可以转化为差分值,每次对两个数取反。

考虑到最后相当于让 $\leqslant 2k$ 个数差分变为 $1$,直接每次状压 DP 转移的时候枚举该最低位和随便一个其它的位,然后增加它们。这时候相当于可以直接最短路求出来消除两个位的值。

时间复杂度 $O(nkl + k2 ^ {2k})$。

CF1615F(*2800)

对于此类题,考虑一种常见的套路:将奇数位上的数取反。然后一次操作相当于将 $01$ 化为 $10$ 或将 $10$ 化为 $01$。于是能互相转换需要满足的条件是 $0$ 和 $1$ 的数量相同。这样可以 $O(n ^ 3)$ 做,但无法通过本题。考虑优化。设 $pre_{i, j}$ 表示,$s$ 的前 $i$ 位中 $1$ 的个数比 $t$ 的前 $i$ 位中 $1$ 的个数多 $j$ 个。$suf_{i, j}$ 表示 $t$ 的后 $i$ 位中 $1$ 的个数比 $s$ 的后 $i$ 位中 $1$ 的个数多 $j$。

这样预处理下来要 $O(n ^ 2)$。

然后加上 $\sum\limits_{i = 0} ^ {n} \sum\limits_{j = -i} ^ {i}pre_{i, j} \times suf_{i + 1, j} \times |j|$。

总时间复杂度 $O(n ^ 2)$。

P5309

分块卡常题。对 $x$ 值进行分块即可。时间复杂度 $O(n\sqrt n)$,但这题卡常。将块长设到 $128$ 可以快一些。还有数据造不满,可以到最后一起取模/hanx

P4359

用优先队列维护,每次相当于取出最大的素因子(保证至少还剩一个),然后替换成比它小的,但得确保没有比它更小的素因子。时间复杂度 $O(K\log K)$。

CF906C(*2400)

很水的一道。直接状压 DP 即可,时间复杂度 $O(n2 ^ n)$。

CF757D(*2200)

看到 $n \leqslant 75$,于是可以计算出 $k \leqslant 20$,这暗示我们用状压 $dp$。

$dp_{i, j}$ 表示,$i$ 这位还没加入,前面状态已有的为 $j$ 的方案数。这样状态转移只需要算后面 $\lceil\log k\rceil = 5$ 位的。

时间复杂度 $O(2 ^ kn\log k)$,可以通过本题。

AT_arc171_d(*2377)

考虑到 $n$ 的取值很小,而 $P$ 的取值很大,于是考虑将 $P$ 的范围降到与 $n$ 同阶。

观察到 $(P, B) = 1$,于是 $x_i B ^ {n - i}$ 一定可以取到模 $P$ 余 $0 \sim P - 1$ 的所有数。于是在 $P$ 足够大(准确意义上是 $P > n$)定可以取出合适的前缀使得 $[1, i]$ 的前缀值互不相同(还有一个是取 $0$ 个数的情况),这样就只需要考虑 $P \leqslant n$ 的情况。

考虑 $hash(l, r)$ 什么时候为 $0$,$hash(l, r) = B ^ {r - n} (hz_l - hz_{r + 1})$,其中 $hz_i$ 表示的是 $[i, n]$ 的哈希和。

由于 $(B ^ {r - n}, P) = 1$,所以只需要对每个点赋值,使 $hz_l \neq hz_{r + 1}$,这样时间复杂度 $O(3 ^ n)$,因为是要枚举一种状态和它的子集来更新它。

P4211

考虑差分。只要维护 $[1, k]$,然后对于每个点想上的到根权值都 $+1$,然后对于询问的一个 $z$,走到它的根的权值总和即为 $LCA$ 深度。

接下来每个询问直接查询前缀和之差即可,重剖 + 线段树,时间复杂度 $O(n\log ^ 2 n + q\log ^ 2 n)$。

CF1009F(*2300)

长链剖分板子题。对于每个点,找到其长儿子,然后共享空间存答案,时间/空间复杂度 $O(n)$。

CF1709E(*2400)

$P(u, v) = dis_u \oplus dis_v \oplus a_{LCA(u, v)}$,其中 $dis_x$ 是点 $x$ 到根的异或和。

那么对于一个点 $x$,设它的所有儿子内的子树都满足条件,那么在该子树内,经过该点的路径中,若有非法的,那么就将这个点的点权设成一个很大且不与之前设的相同。

用 set 维护每个点子树内可能与其它值起冲突的点到该根的异或和。如果起了冲突,那么修改点权并清空 set。合并时用一下启发式,时间复杂度 $O(n\log n)$。

CF965E(*2200)

考虑贪心。每次是将一个点子树内深度最大的点换成这个点,从而减少总字符数。直接优先队列维护深度最大值,时间复杂度 $O(n\log n)$。

CF1139D(*2300)

什么憋憋 *2300。真能用 DP 做吗?感觉莫反思路更顺一点。

$$
\begin{align}
E(X) &= \sum\limits_{i = 1} ^ {m} P(X = i) \times i\\
&= \sum\limits_{i = 1} ^ {m} P(X\geqslant i)\\&= 1 + \sum\limits_{i = 1} ^ {m}P(X > i)\\&= 1 + \sum\limits_{i = 1} ^ {m} (1 - P(\gcd(a_1, a_2,\cdots, a_i) = 1))\\&= 1 + \sum\limits_{i = 1} ^ {m} \frac{m ^ i - \sum\limits_{j = 1} ^ {m}\mu(j)\times\lfloor\frac{m}{j}\rfloor ^ {i}}{m ^ i}\\&= 1 - \sum\limits_{j = 2} ^ {m}\mu(j)\sum\limits_{i = 1} ^ {m}\frac{\lfloor\frac{m}{j}\rfloor ^ i}{m ^ i}\\&= 1 - \sum\limits_{j = 2} ^ {m}\mu(j)\sum\limits_{i = 1} ^ {m} (\frac{\lfloor\frac{m}{j}\rfloor}{m}) ^ {i}\\&= 1 - \sum\limits_{j = 2} ^ {m}\mu(j)\frac{\lfloor\frac{m}{j}\rfloor}{m - \lfloor\frac{m}{j}\rfloor}
\end{align}
$$

后面时间复杂度 $O(n)$ 直接算即可。

CF1088E(*2400)

先树型 DP 出连通块最大值 $mx$,然后再 DP 一次,只要搜到某个子树内连通块最大值为 $mx$ 就计入答案,并且防止下次再加上该最大值将该点向上的贡献设成 $-1$ 即可。时间复杂度 $O(n)$。

CF1260E(*2400)

容易发现,若朋友不是第 $n$ 个人,那么肯定要贿赂第 $n$ 个人。且若朋友出现的位置 $\leqslant \frac{n}{2}$,那么显然至少还要贿赂一个人。即在 $[\frac{n}{2}, n]$ 至少贿赂两个人。以此类推,直接 priority_queue 从后往前贪心即可。时间复杂度 $O(n\log n)$。

P3041

如果直接状压 DP,状态有 $3 ^ k$ 种。于是考虑优化 DP。

建出来 AC 自动机。这样就将状态数缩减到 $\sum\limits_{i = 1} ^ {n} |s_i|$ 种。

$dp_{i, j}$ 表示,选择了 $i$ 个字符,跳完失配指针后在第 $j$ 个节点上的答案最大值。

时间复杂度 $O(k\sum\limits_{i = 1} ^ {n} |s_i|)$。

CF163E(*2800)

先建好 AC 自动机,然后容易发现问题就在于每次增加/减少一个数如果跳失配指针的话时间复杂度太高。以及每次统计的时候要往前跳失配指针时间复杂度压不下去。

建好 fail 树然后相当于询问直接加上它所有祖先给它加上的值,删除就给它子树内的点权值都减 $1$。这样直接 dfn 序然后树状数组即可。

记 $m$ 为 $\sum\limits_{i = 1} ^ {n} |s_i|$,则时间复杂度为 $O(m\log m)$。

CF1202E(*2400)

正着倒着各建一个 AC 自动机,然后对于每个点,直接加上它失配指针的权值就是该点的总贡献。

然后 $dp_{i}$ 表示,原串前 $i$ 个字符能匹配到后缀的有多少个,然后反着匹配,原串 $i + 1$ 及后面的字符匹配后缀匹配到的数量相乘即可。

时间复杂度 $O(n)$。

CF1400F(*2800)

考虑直接 DP 出不合法的构建方案。如果 $x = 1$ 显然只有 $1$ 种方案。

如果 $x\geqslant 2$,那么显然不能有 $s_i = 1$,这样就相当于每个元素都 $\geqslant 2$,于是区间长度 $\leqslant 10$,这时候就可以尝试暴力搜,然后得出来最多是 $n = 19$ 的时候有 $2399$ 种,于是直接全插 AC 自动机里。

然后 $dp_{i, j}$ 表示,前 $i$ 个字符,末尾匹配到 $j$ 的最小删除的数的个数。这样即可通过。

CF547E(*2800)

考虑把询问离线下来。

对于每个字符串插入然后对于这个点直接权值加 $1$,然后每次只需要询问 fail 树该点子树内的权值和即可。

记 $m$ 为 $\sum\limits_{i = 1} ^ {n} |s_i|$,则时间复杂度为 $O(m\log m)$。

wqs 二分

引入:有若干个物品,要求你选出 $m$ 个(这里就假设是算最大值),选的时候带有限制,要你求出最优的方案。

注意在使用的时候有个大前提,就是先假设 $f(i)$ 为选出来 $i$ 个的最优方案,那么 $(i, f(i))$ 构成的曲线一定构成凸包(这里假设是上凸包,就是 $w_{i} - w_{i - 1} \geqslant w_{i - 1} - w_{i - 2}$)。

二分一个斜率 $c$,然后相当于凸包上与斜率为 $c$ 的直线相切的点 $(x, f(x))$ 一定是 $f(x) - cx$ 最大的,于是这样就直接让原来的每个物品的价值减少 $c$,然后贪心地选使得 $f(x) - cx$ 最大,这个最大的点 $(x, f(x))$ 若 $x > k$,那么相当于是切点靠后,于是需要调小 $c$,否则需要调大 $c$。 然后当 $x = k$ 的时候,直接求出来最大的 $f(x) - cx$ 再加上 $cx$ 即可。假如存在那种三点共线的情况,。时间复杂度 $O(n\log n)$。

P2619

先扔出来结论就是设 $f(k)$ 为选取的白色边为 $k$ 条的最小生成树的边权,则 $f(k)$ 是下凸函数。因为相当于直接跑出来的最小生成树 $mn$ 条白边,这里 $f(mn)$ 在 $mn$ 处取最小值。然后不管是增加还是减少一条白边,需要的边权一定增加且越到后面需要的代价越大。

于是直接二分斜率 $c$,切点靠前的话 $c$ 就增加否则减少,然后计算的话就是每条白色边减掉 $c$,然后求出来最小生成树白色边的数量。若多于 $need$,$c$ 减小,否则 $c$ 增加。时间复杂度 $O(E \log \frac{\max(v_i)}{\min(v_i)})$。 其中 $v_i$ 代表第 $i$ 条边的边权。

CF140E(*2600)

先考虑满足每行相邻小球颜色不同的方法数。令 $dp_{i, j}$ 表示,前 $i$ 个小球,染了 $j$ 种颜色,则有

$$
dp_{i, j} \times (j - 1) \to dp_{i + 1, j}, dp_{i, j} \to dp_{i + 1, j + 1}
$$
即 $dp_{i, j} = dp_{i - 1, j - 1} + dp_{i - 1, j} \times (j - 1)$。 自然还要乘上 $j! \times C_{m} ^ {j}$。

记 $g_{i, j}$ 表示前 $i$ 行,其中第 $i$ 行被 $j$ 种颜色染的情况数。
$$
g_{i, j} \times dp_{l_i, k} \times k! \times C_{m} ^ {k}\to g_{i + 1, k} (k \neq j)\\g_{i, j} \times dp_{l_i, k} \times k! \times (C_{m} ^ {k} - 1) \to g_{i + 1, j}
$$
记 $qz_i = \sum\limits_{j = 1} ^ {l_i} g_{i, j}$,则有 $g_{i + 1, j} = j! \times dp_{l_i, j} \times (qz_i \times C_{m} ^ {j} - g_{i, j})$。

时间复杂度 $O(\sum\limits_{i = 1} ^ {n} l_i)$,可以通过本题。

CF1514D(*2000)

考虑到若区间众数有 $x$ 个,那么若 $x \leqslant \lceil \frac{len}{2} \rceil$,那么答案就是 $1$,否则答案就是 $x - (len - x)$,因为一个区间里该众数的个数和其它数的个数总和之差 $\leqslant 1$。

对于每个区间选出众数这玩意儿可以随机化,或者考虑到绝对众数出现的位置一定在该区间排序后的 $\lfloor \frac{r - l + 1}{2} \rfloor$ 位,于是只需要主席树维护一下即可,时间复杂度 $O(q\log n)$。好像还有什么摩尔投票的方法解决,但我一直没想清楚时间复杂度,觉得有 $O(qn)$,这就先咕了。

CF1420E(*2500)

令 $dp_{i, j, k}$ 表示,前 $i$ 个人中有 $j$ 个人有护盾且最后一个人 $(i)$ 也有,将原数组前 $j$ 个有护盾的人匹配过来需要 $k$ 的代价时选取前 $i$ 个数中的两个作为需要守护的人。时间复杂度 $O(n ^ 5)$,空间复杂度 $O(n ^ 4)$,可以通过本题。

AT_agc052_b(*2473)

观察到题目中有个性质是 $n$ 为奇数,但不知道如何利用。说实话自己训练量还是不够啊,感觉这题思路不太自然。

边权转化为点权,每个点的点权等于它父亲节点的点权异或上它到它父亲的边权。那么容易证明对于每次操作,相当于交换两个点的点权。

后面手玩数据发现并不可行,其实是因为没考虑根节点与其中一个儿子的操作,于是只需要在根上面再建一个虚拟节点,这时候只需要算出虚拟边最后的权值即可(因为相当于所有点都有异或这个)。

这里突破口其实就是 $n$ 为奇数这个条件。$w_2$ 的异或和是 $w_1$ 的异或和再异或上虚拟边的权值,然后只需要检查一下 $w_1$ 和 $w_2$ 是否能对应上即可。时间复杂度 $O(n)$。

AT_agc040_c(*2740)

这种唐诗智慧题,感觉给我自己搞永远都想不出来。

对奇数位和偶数位进行黑白间隔染色,然后将奇数位上的 $A$ 换成 $B$,偶数位上的 $B$ 换成 $A$,那么相当于不能删除 $AA$ 或者 $BB$,于是考虑一种贪心的删法,每次用一个 $C$ 或者另一个字符删除多的那个。于是不合法的情况就是 $A$ 或者 $B$ 的个数 $> \frac{n}{2}$,这样直接减去不合法的情况就好,时间复杂度近似线性,因为还有逆,但只跑了 $1.7s$。

CF1641D(*2700)

啥啥 bitset 和根号分治有些复杂,这玩意儿看出 $m$ 很小,直接随机化暴冲。

将 $a$ 离散化下来,设为 $[1, S]$ 的元素,假如 $S$ 很小,那么直接暴力 $O(S2 ^ S)$ 过题。于是考虑缩小 $S$。

具体而言,选取一个模数 $P$,然后给 $[1, S]$ 中的数赋上随机权值。这样离散化数值相同的数所赋的权值一定相等,但是可能会有实际上不同的元素赋上相同的权值,这里正确性的概率是 $\frac{C_{P - 5} ^ {5}}{C_{P} ^ {5}}$ 这里取 $P = 20$ 就 $≈ 0.2$。

随机化 $20$ 次就差不多可以达到 $> 99 \%$ 的正确率,时间复杂度 $O(TP2 ^ P)$,可以通过本题。

CF888G(*2300)

显然要建 trie 树。考虑合并的时候,假如 $0$ 和 $1$ 的子节点都存在的话,那么拿出 $0$ 的所有节点,然后在 $1$ 这棵子树中找异或最小值,递归求解即可。

考虑到每个数在 trie 树上深度最大是 $30$,于是每个数暴力求解的次数不会超过 $30$,考虑存下 trie 树上每个点子树内在数组中的编号,但这样空间会炸掉。

然后发现单调性,就将原数组排完序后对于 trie 树每个节点求出在数组中最左边和最右边在该子树内的下标。时间复杂度 $O(n\log ^ 2 {\max\limits_{i = 1} ^ {n} a_i})$,可以通过本题。

CF843D(*3400)

抽象题。

先求一下最短路。

对于每次更新,新设置一个 $add$ 数组,然后维护值域那么多个堆,从小到大依次加,$add_x = \min(add_x, add_{fa} + c_{fa, x} - dis_x)$,其中 $c_{x, y}$ 表示 $x$ 到 $y$ 的边权,$dis_x$ 表示更新前 $1$ 到 $x$ 的最短路径长度。

这样时间复杂度即为 $O(q\times (n + m))$,时限 10s 还有点卡,把 vector 换成链式前向星是可以通过本题的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868437.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#进阶-在Ubuntu上部署ASP.NET Core Web API应用

随着云计算和容器化技术的普及,Linux 服务器已成为部署 Web 应用程序的主流平台之一。ASP.NET Core 作为一个跨平台、高性能的框架,非常适合在 Linux 环境中运行。本篇博客将详细介绍如何在 Linux 服务器上部署 ASP.NET Core Web API 应用,包括部署准备、应用发布、配置反向…

【CodeForces训练记录】Codeforces Round 996 (Div. 2)

训练情况赛后反思 开局连WA就知道这把完蛋了,应该要掉大分了,A题没考虑清楚,B题犯傻了一时间没看出来结论 A题 当且仅当两个人贴贴的时候,轮到谁走谁就输,后手可以把先手逼到两边,如果两人之间有一段距离,两人都必须往中间靠,如果两个人都往同一边走距离不变为无效操作…

2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One

2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One2025 特斯拉 焕新 Model Y 增减配置详细参数对比分析图解 All In One 焕新 Model Y 增配风阻降低到 0.22 Cd ✅ 车身变长到 4797 mm ✅ 车头保险杠新增一颗摄像头 ✅ 新增前排座椅通风 ✅ 新增后排座椅电动折…

Kernel Memory 让 SK 记住更多内容

Kernel Memory (KM) 是一种多模态 AI 服务,专注于通过自定义的连续数据混合管道高效索引数据集。它支持检索增强生成(RAG)、合成记忆、提示工程以及自定义语义记忆处理。KM 支持自然语言查询,从已索引的数据中获取答案,并提供完整的引用和原始来源链接。 通过 KM 我们可以…

大普时钟模块(Clock Module)

时钟模块(Clock Module) 同步精度高、保持能力强、温度稳定度高、频率准确度高、短稳性能强。 CM11T系列时钟模块,内置TCXO、超宽温,同步精度50ns CM55、CM22系列时钟模块,内置OCXO、超高精度 CM30系列时钟模块,内置OCXO、高频低噪 CM66系列时钟模块,内置OCXO+GNSS接收机 …

《CPython Internals》阅读笔记:p97-p117

《CPython Internals》学习第 7 天,p97-p117 总结,总计 21 页。 一、技术总结 1.词法分析(lexical analysis) 根据《Compilers-Principles, Techniques, and Tools》(《编译原理》第2版)第 5 页:The first phase of a compiler is called lexical analysis or scanning. T…

Qwen2ForSequenceClassification文本分类实战和经验分享

本文主要使用Qwen2ForSequenceClassification实现文本分类任务。 文章首发于我的知乎:https://zhuanlan.zhihu.com/p/17468021019 一、实验结果和结论 这几个月,在大模型分类场景做了很多实验,攒了一点小小经验。 1、短文本 1)query情感分类,一般不如BERT ps:结论和,htt…

Ubuntu22.04 解决 E: 无法定位软件包 yum

1、修改 sudo vim /etc/apt/sources.list的内容,将下文内容增加至该文件中:deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu…

【安全运营】第6年实践总结

一、安全运营全景图 安全运营全景图调整的原因:一是公司在文化、部门、人员方面调整,导致有些部分不再适用;二是2024年针对安全运营规划开会讨论过多次,部分逻辑和内容有变化;三是安全运营工作范围有变化,需要进行合并、增加;四是经过2024年的实践,个人的观点有变化,需…

如何使用 Logstash 8 连接 Easysearch

背景 很多小伙伴都在使用 Logstash ,随着各家安全扫描、安全策略的加固,不少小伙伴已经开始使用 Logstash 8 了。在使用 Logstash 8 连接 Easysearch 的时候可能会遇到问题,比如下图。提示连接的不是兼容版本的 Elasticsearch 。 解决方法有两种 两种方法对 Logstash 和 Log…

【Raspberry PI】Raspberry PiSP摄像头前端(rpl-cfe)

1.PiSP相机前端 PiSP 摄像头前端 (CFE) 是一个将 CSI-2 接收器与 一个简单的 ISP,称为前端 (FE)。 CFE 有四个 DMA 引擎,可以从四个单独的流写入帧 从 CSI-2 接收到内存。也可以路由其中一个流 直接给 FE 做最少的图片处理,写两个版本 (例如,未缩放和缩小版本)将接收…

一文看懂“高大上”的边缘计算!!

一、边缘计算(Edge Computing) 边缘计算是一种分布式计算架构,其核心思想是将计算、存储和数据处理任务从云端推到靠近数据源的设备或网络边缘。通过这种方式,数据可以在本地(离数据源更近的地方)进行处理,从而减少延迟、减轻带宽负担、提高处理效率,并降低对远程数据中…