\(1\) 个 set 有 \(10\) 道题。
A. CF1874D Jellyfish and Miku
设 \(f_i\) 为 \(i\to n\) 的期望步数。那么有 \(f_0=f_1+1\),\(f_n=0\),和 \(f_i=f_{i+1}\times \frac{a_{i+1}}{a_i+a_{i+1}}+f_{i-1}\times \frac{a_i}{a_i+a_{i+1}}+1\)。这个的意思是 \(i\to i+1\) 走了 \(1\) 步并花费 \(f_{i+1}\) 的期望代价走到 \(n\),另一边同理,并乘上概率系数即可。
我们对期望式子进行变形,可以得到 \(a_{i+1}(f_i-f_{i+1})=a_i(f_{i-1}-f_i)+a_i+a_{i+1}\)。令 \(g_i=f_{i-1}-f_i\)。就得到 \(a_{i+1}g_{i+1}=a_ig_i+a_i+a_{i+1}\),并且 \(g_1=1\)。
经过简单的累和法可以非常容易的得到,\(g_i=1+\frac{2\times \sum_{j<i}a_j}{a_i}\)。我们换回 \(f_i\) 发现还是差分的形式,继续施累和法,可以得到 \(f_i=2\times \sum\frac{1}{a_i}(\sum_{j<i}a_j)+n\)。
接下来我们的目的就是最小化 \(\sum\frac{1}{a_i}(\sum_{j<i}a_j)\)。注意到后面的式子是 \(\sum\) 的形式,我们直接背包,设 \(h_{i,j}\) 为考虑前 \(i\) 个,前 \(i\) 个 \(\sum\) 为 \(j\) 的上述式子的最小值。有 \(h_{i,j}=h_{i-1,j-k}+\frac{j-k}{k}\)。这个是 \(O(nm^2)\) 的。
接下来有两种做法:
- 分析 bound 调和级数。我们有结论是 \(\{a_i\}\) 不降。你可以通过调整法证明。这样就有界是 \(j+(n-i)k\leq m\),则 \(k\leq \frac{m-j}{n-i}\)。这样对于每个 \(j\) 分析很容易分析到 \(O(m^2\log n)\) 可以通过。
- 决策单调性分治。注意到转移显然是 \(h_{i,j}=\min\{h_{i-1,j-k}+w(j,k)\}\) 的形式。我们要证明四边形不等式,即 \(w(l,r-1)+w(l+1,r)\leq w(l+1,r-1)+w(l,r)\)。这个你写出来发现是显然的,自己推一下就好。然后上决策单调性分治即可。
另一种关于链上期望 dp 的思考方式:
即设 \(f_i\) 为 \(i\to i+1\) 的期望步数。为什么这么设定呢?因为在链这个特殊结构中,\(i\) 想要到达终点 \(n\),必须要经过 \(i+1\)。那么你的答案就是 \(\sum f_i\)。具体的,在这道题中,有 \(f_i=(f_{i-1}+f_i+1)\times \frac{a_i}{a_i+a_{i+1}}+\frac{a_{i+1}}{a_i+a_{i+1}}\)。这个的组合意义是你有 \(\frac{a_{i+1}}{a_i+a_{i+1}}\) 的概率花费 \(1\) 直接走到 \(i+1\),有 \(\frac{a_i}{a_i+a_{i+1}}\) 的概率走到 \(i-1\) 并花费 \(i-1\to i\) 加上 \(i\to i+1\) 再加上 \(i\to i-1\) 的一步走到 \(i+1\)。然后推式子即可。
B. CF2155F Juan's Colorful Tree
先写一下不知道能不能过。
首先看到 \(\sum siz_i=S\),\(S\) 又非常小,于是考虑根号分治。我们设 \(siz_i>\sqrt{S}\) 的点为大点。反之则为小点。
首先思考若一个路径上有小点,那么答案一定是小于 \(\sqrt{S}\) 的。我们直接找到这个小点,并 check 每一种颜色是否在路径上都存在。
如何 check 这个东西:
我们对每种颜色使用并查集。因为原图是一棵树,所以其全包含此种颜色的充要条件是左端点 \(u\) 和右端点 \(v\) 在颜色 \(\text{col}\) 这个并查集上连通。
至于空间,由于 \(\sum siz_i=S\),所以你的总空间是 \(S\)。于是也是不会爆的,然后你判的时候先判一下两个端点是否都有这个颜色即可。
对于全是大点的路径,感觉非常不好处理。事实上我们可以弱化成两个端点全是大点。然后另一边我们做的就是存在一边是小点(然后遍历那个小点)。
我们考虑直接预处理这个东西。设 \(f_{i,j}\) 为第 \(i\) 个大点到第 \(j\) 个大点的路径的答案。我们先固定一个端点。然后枚举其他大点作为端点。由于大点只有 \(\sqrt{S}\) 个。又因为 \(\sum siz_i=S\),所以你还是可以直接枚举元素,然后直接 check,这样均摊是 \(S\sqrt{S}\) 的。
总复杂度 \(O((q\sqrt{S}+S\sqrt{S})\alpha(n))\)
被卡常了,寄,先不管了。
C. CF62E World Evil
网格图上网络最大流一般转为最小割处理。
这是一道模拟最小割的题目。维护竖直切割线以及横向切割线。
我们直接对着最小割定义涉及状态并且按照最小割转移。设 \(f_{i,S}\) 为前 \(i\) 行到第 \(i\) 行的“是否割”集合为 \(S\),\(S\) 这一位为 \(1\) 代表这个点已经没有流量了,否则是有流量的。
按照定义,一个行一定是一个前缀被分到集合 \(S\),一个后缀被分到集合 \(T\)。考虑第 \(i\) 层,如果相邻两个位置“是否无流量”的 \(\text{stat}\) 是不同的,那么就必须切割掉他们之间的边,因为你不能让有流的流到没流的,这样就割不掉了。
考虑层间的转移,若想让一个位置的 \(\text{stat}\) 从 \(0\) 变成 \(1\)。那么就需要切割掉他们之间的边。
所以这一切都是在模拟最小割而已。
省掉枚举子集的方法(类完全背包)
for(LL j = 0; j < (1 << n); j ++)for(LL k = 0; k < n; k ++)if(!(j & (1 << k))) f[j | (1 << k)] = min(f[j | (1 << k)], f[j] + A[k][i]);
就相当于每次加一个物品而非枚举子集。显而易见的可以达到目的。
D. CF2150E1 Hidden Single (Version 1)
注意到题目主要矛盾点在于 \(2n-1\) 和 \(2n\)。而一个数会出现 \(1\) 到 \(2\) 次。我们不妨假设在 \([1,2n-1]\) 中出现 \(1\) 次的数的集合为 \(S\),两次的集合为 \(T\)。我们最开始不知道哪个数出现一次。于是我们假设其全部出现两次。也就是把 \(\{1,2...,n\}\) 全部归为 \(T\)。
接下来考虑分治。我们考虑下传集合。对于 \(S\) 中的数,我们只需询问 \([l,mid]\) 就知道其在 \([l,mid]\) 还是 \([mid + 1,r]\)。对于 \(T\) 中的数,询问两次,若左边右边都有出现,则两边出现一次,否则只有其中一边有。
但是你注意以下那个单个的 \(x\),他一定会一直待在 \(T\) 集合中,这点不难发现。于是这就是矛盾的!我们一定会有一边的真实集合大小是大于区间长度的,于是特殊数一定出现在其中一边,于是我们递归到区间长度为 \(1\) 时就可以找到答案。
分析一下询问次数:长度为 \(len\) 的区间会询问 \(len+1\) 次。则询问次数约为 \(2n+n+\frac{n}{2}+\frac{n}{4}+...<4n\)。中间可能会浪费一些询问,最终一定小于询问次数上界。
E. CF1439D INOI Final Contests
好题。反正我觉得挺难的。
首先我们观察到这个东西很难维护,但是你发现这是一个合并连续段的形式。我们可以在潜意识里想到长度为 \(len1\) 和 \(len2\) 的两个完全不相关的连续段合并,于是这是一个子问题的形式,我们可以根据这设计 dp。
设 \(f_{i,j}\) 为前 \(i\) 个电脑,\(j\) 个人的 \((a_{\{j\}},b_{\{j\}})\) 对方案数,\(g_{i,j}\) 是前 \(i\) 个电脑,\(j\) 个人的答案。
转移时我们考虑枚举一个极长的连续坐人的段来转移,假设其为 \(l\),则 \([i-l+1,i]\) 这一段必须坐满人,而我们限制 \(i-l\) 这个位置必然是不坐人的。就可以做到递归子问题。
有转移:\(f_{i,j}=f_{i-l-1,j-l}\cdot f_{l,l}\cdot \binom{j}{l}\),最后成的组合数是分配编号。\(g_{i,j}=(g_{i-l-1,j-l}\cdot f_{l,l}+g_{l,l}\cdot f_{i-l-1,j-l})\cdot \binom{j}{l}\),这个“方案数”和“贡献”的计算是一个非常经典的东西,可以积累一下。
那么你看我们现在不应该知道什么,其实是 \(f_{i,i}\) 和 \(g_{i,i}\),那接下来我们考虑如何做这个。不妨设 \(F_{i}=f_{i,i}\) 和 \(G_i=g_{i,i} \)。
我们考虑上面我们说的一个一个人插,合并连续段的转移。有 \(F_i=F_j\cdot F_{i-j-1}\cdot (i+1)\cdot \binom{i}{j}\),\((i+1)\) 这个系数就是 \([1,j]\) 这些位置可以通过从左边走到达,而 \([j,i]\) 这些位置可以从右边到达,这样一共 \((i+1)\) 个位置。
接下来是 \(G_i\),也是转移中相对最复杂的。考虑左右两侧的贡献和 \(i\) 自身对答案的贡献。
- \(i\) 对答案的贡献,设 \(S(i)\) 为 \(\sum_{j=1}^i j\)。有贡献 \(\binom{i-1}{j-1}\cdot (S(j-1)+S(i-j))\cdot F_{j-1}\cdot F_{i-j}\)。
- 左右对答案的贡献,就是上面那个东西。\(G_i=(G_{j-1}\cdot F_{i-j}+G_{i-j}\cdot F_{j-1})\cdot (i+1)\cdot \binom{i-1}{j-1}\)。
然后就做完了。