20260317模拟赛

20260317模拟赛

排序

题面:

初始一个排列 \(p=\{1,2,3\}\)\(0\) 表示 \({\rm swap}(p_1,p_2)\)\(1\) 表示 \({\rm swap}(p_2,p_3)\),一个二进制串合法当且仅当依次操作完后 \(p\) 还是 \(\{1,2,3\}\)。给你一个串,将其中 \(?\) 替换为 \(0/1\),问有多少个合法且恰好包含 \(n\)\(0\)\(m\)\(1\) 的串。\(n,m\leq 10^6\)

题解:

考虑如何判断一个串合法,记 \(sta\) 变量初始为 \(0\),若 \(sta\) 与下一个字符奇偶性相同就加一否则减一,合法当且仅当最后 \(sta\)\(6\) 下为 \(0\)

考虑先将所有 \(?\) 变为 \(1\) 求出最终的 \(sta\) 值,其中有若干位置如果将 \(1\) 改为 \(0\) 会使得最终的 \(sta\) 加二,另一些则会减二,由于这不影响奇偶性所以互相之间的独立的。

求出有 \(x\) 个位置会加二,\(y\) 个减二,枚举 \(i\leq x\) 个加二变成零,则根据总共有 \(n\) 个零唯一确定有 \(f(i)\) 个减二变成零。答案为 \(\sum_i\big[i\leq x\big]\big[f(i)\leq y\big]\big[sta+2i-2f(i)\equiv 0\big]\binom x i\binom y {f(i)}\)

旅行

题面:

给你一棵 \(1\) 为根的树,节点 \(i\) 的父亲是 \(p_i\),父边权是 \(w_i\),你需要给除根外的每个点赋点权 \(t_i\leq T\),根的点权固定为 \(0\),要求 \(t_{p_i}\leq t_i\)。最大化 \(\sum C_{t_i}+\sum w_i(t_i-t_{p_i})\)。对于以每个点为根的子树求这个答案。

\(n\leq 5\times 10^5,T\leq 5\times 10^6\)

题解:

先考虑 \(rt=1\) 的答案,记 \(A_u=-w_u+\sum_{v\in son_u} w_v\)。则答案为 \(C_0+\sum_{i=2}^n(C_{t_i}-A_i\times t_i)\)

将所有 \((i,C_i)\) 看做平面的点,则 \(C_{t_i}-A_i\times t_i\) 为以 \(A_i\) 斜率的直线切凸壳,切到的点即为 \(t_i\),此时的截距即为这个值。

但是如果 \(A_{p_u}<A_u\) 则两个不可能同时取到最优解,此时定有 \(t_u=t_{p_u}\),所以可以将两个点合并。对于集合 \(S\) 其贡献为 \(|S|C_t-t\sum A_i=|S|\big(C_t-t\times \dfrac{\sum A_i}{|S|}\big)\),切的斜率为 \(A_i\) 平均值。

自底向上合并,每次取出子树斜率最大的连通块决策是否与当前根合并,可并堆维护所有连通块即可。合并到当前点时取得其子树的答案,注意答案是当前点合并之前的值,因为根的 \(t_i\)\(0\)

每次改变连通块求他的凸包最优点也是二分 \(O(\log n)\) 的,总复杂度 \(O(n\log n)\)

posted @ 2026-03-20 11:21  programmingysx  阅读(4)  评论(0)    收藏  举报
Title