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)\)。

浙公网安备 33010602011771号