近期总结2023.10.15
ARC162D Smallest Vertices
题意:一棵外向树,根为 \(1\),给出每个点的出度 \(d_i\)。求所有合法的树中,满足其是其子树中最小编号的点的个数总和。
\(1\le n\le 500\)
考虑一个点的贡献次数。
枚举这个点 \(v\),那么我们把 \(v+1...n\) 选若干个点作为 \(v\) 子树中的点,其余为子树外。
我们需要保证 \(v\) 子树内的点的总度数合法,即 总度数 \(=\) 总点数 \(-1\)。
考虑 \(\text{DP}\),设 \(f[i,j,k]\) 表示考虑了点 \(i...n\),选了 \(j\) 个点,度数总和为 \(k\),这是一个背包的形式,可以把第一维压掉。
然后枚举子树内点数,剩下的就是 \(\text{Prufer}\) 序列的事了。
\(O(n^3)\)。
CF1517F Reunion
题意:一棵树,每个点各有 \(\frac 12\) 的概率染白或染黑。求纯黑邻域最大半径的期望,模 \(998244353\)。
考虑一个经典套路:枚举 \(L\),求最大半径 \(\ge L\) 的概率,加起来就是期望。
\(\ge L\) 可以转化为 \(<L\),即每个点在 \(L\) 距离内都至少有一个白点。或者说,一个白点覆盖距离他 \(\le L\) 的点,求所有点被覆盖的概率。
设 \(f[u,i]\) 表示点 \(u\) 子树全被覆盖,并且深度最浅的白点深度为 \(i(i\le L+1)\) 的概率;设 \(g[u,i]\) 表示点 \(u\) 子树中存在一个最深的深度为 \(i(i\le L)\) 的点未被覆盖的概率。
转移直接分四种讨论即可,\(O(n^3)\)。
ARC153D Sum of Digits
题意:给出 \(n\) 个数 \(a_{1...n}\),设 \(S(p)\) 为 \(p\) 的各位数字之和,求 \(\min\limits_x\{\sum\limits_{i=1}^n S(a_i+x)\}\)。
考虑直接一位一位填 \(x\)。
枚举当前填第 \(i\) 位,填了 \(k\),那么数位 \(\ge 10-k\) 的会被进位。
但是一些数字第 \(i-1\) 位可能也会进位,这时他们的限制为 \(\ge 9-k\) 会被进位。
设 \(f[i,j]\) 表示填了前 \(i\) 位,第 \(i\) 位进位的有 \(j\) 个数的答案。
尝试转移到 \(f[i+1,]\),考虑经典方法,只有 由第 \(1...i\) 位组成的数 最大的 \(j\) 个会被进位,我们按照这个组成的数排序,那么第 \(n-j+1...n\) 个数会进位。
然后就是统计前缀后缀 \(\ge\) 特定值的数的个数,二维前缀和即可。
AGC001F Wide Swap
题意:一个排列 \(P_{1...n}\),交换 \(P_{i},P_j\) 的条件为 \(|i-j|\ge k\) 且 \(|P_i-P_j|=1\),求经过若干次交换后可以得到的字典序最小的排列。
\(1\le n\le 5\times10^5\)
注意到 \(|P_i-P_j|=1\) 这个限制很烦,考虑 \(P\) 的逆排列 \(Q\)(即 \(P_{Q_i}=Q_{P_i}=i\)),我们其实就是相当于交换 \(Q\) 中相邻两个绝对值之差 \(\ge k\) 的数。
套用 Luogu3243 菜肴制作 的结论,我们只需让 \(Q\) 翻转后的字典序最大即可。
考虑从后往前枚举依次填 \(Q\),先思考如何填 \(Q_n\)。
一个数可填,那么他就可以通过相邻交换移到 \(n\),因此条件为他比他后面的数都要大至少 \(k\)。
考虑拓扑排序,每个点 \(x\) 对 前面的数 \(\in[x+1,x+k-1]\) 连边。
用线段树维护入度数组,支持区间加、单点修改、查询最右边的最小值,\(O(n\log n)\)。