ABC470
复健第一场 VP。
A
模拟。
B
总个数减去最多的个数。
C
STL 题,被阴了。
注意到大多数情况下值为 \(0\) 的位置很多,而为 \(1\) 的位置最多 \(Q\) 个,因此一次操作 2 的操作次数不会很大。
使用一个 set 存下所有值不为 \(0\) 的位置,操作 2 就对 set 里的所有下标操作,如果减到 \(0\) 了就删掉。
由于异或一个数两遍等于没异或,更新一个数只需要异或老版本,再异或新版本。
D
下标换来换去题。
只需要用一个辅助数组记录每个值对应的下标,按题意 swap 即可。
E
记忆化搜索。
由于算期望,每张牌本质相同,故可以用两个量 \((x,y)\) 记录场上剩余的未知牌的数量和已知牌的数量,这足以描述牌面的全部信息。而所有牌的分数也只需要保留一个平均分 \(\overline{a}\) 的信息。我们只需要求期望能扔掉的对子数量 \(X\),答案就是 \(X \overline{a}\)。
再记录剩余生命 \(l\),已经构成了一个完整的状态。下面考虑转移。
考虑最优策略是什么,显然出现成对的直接扔掉,没有就再翻一张。分类讨论:
- 新翻一张在已知牌里出现过,第二张翻已知的那张,一起扔掉;
- 新翻一张没在已知牌里出现过,第二张刚好和第一张一样,一起扔掉;
- 新翻一张没在已知牌里出现过,第二张在已知牌里出现过,下一回合(如果还有生命)把第二张那对一起扔掉;
- 新翻的两张都没在已知牌里出现过,且不相等,都加入已知牌。
转移是容易写的,稍微注意下细节。
F
在图上考虑,位置当成节点,一组可以交换的位置当成边,则构成了若干个连通块,交换在图上进行。
首先 \(10^100\) 是充分大的。最坏情况下把一个字母换到目标位置是 \(O(n)\) 的,换成目标的字符串所需的步数是 \(O(n^2)\) 的。题目数据范围下 \(n^2<<10^100\)。
容易想到对所有的连通块计算排列数 \(\dfrac{t!}{\prod_{i=1}^{26} t_i!}\),再累乘。但是不对。
我们并不能保证任何能通过交换得到的字符串都能用 \(10^{100}\) 次交换得到。假如一个连通块不存在相同字母,达到一个目标排列的所有可行交换次数的奇偶性是固定的。这是因为一次交换造成的逆序对数量的变化量是奇数。如果所有连通块都没有相同字母,那最终答案要乘 \(\frac{1}{2}\)。
而如果有一个连通块里存在相同字母,这对相同字母就可以通过互换消耗一个步数,而不产生任何影响。此时奇偶性的限制失效,之前的公式即为答案。
取模意义下除法使用乘法逆元表示。
G
听说是吉司机线段树,先咕咕。

浙公网安备 33010602011771号