AtCoder Beginner Contest 261 (C~F+G+Ex)
省流:A -2 然后 30min 过 ABCDEF 开始罚坐,看着自己 rank 一点一点掉下去一百多=_=
虽然 A -2 但是仍然懒得写 AB
ABC261C NewFolder(1)
依照题意开个 std::map<string,int>
模拟就行了。AC Code
ABC261D Flipping and Bonus
考虑 DP,设 \(f(i,j)\) 表示前 \(i\) 次掷骰子,并且此时分数为 \(j\) 的最大钱数。
根据题意有两种决策,分别对应两种转移:
- 正面朝上,\(f(i,j)\to f(i+1,j+1)\)。
- 反面朝上,\(f(i,j)\to f(i+1,0)\)。
在转移的过程中计算钱数即可。复杂度 \(O(N^2)\)。AC Code
ABC261E Many Operations
我们考虑拆位,对于第 \(i\) 位算出来最终是 \(0\) 还是 \(1\)。现在只需要考虑 \(X,A_i\in\{0,1\}\) 的情形。
可以发现,这些操作虽然不具有结合律,但最终操作带来的贡献可以等效为以下四种:
- 将原数保持不变。
- 将原数取反。
- 将原数强制赋值为 \(0\)。(即 $x\leftarrow x\text{ and }0 $ )
- 将原数强制赋值为 \(1\)。(即 $x\leftarrow x\text{ or }1 $ )
\(\text{xor}\) 的贡献相当于将目前的贡献在第 \(3,4\) 种之间互换,或者在第 \(1,2\) 种之间互换。
于是我们就处理出了操作序列的每个前缀等效的贡献。最后把每一位合并起来就行了。
时间复杂度 \(O(N\log V)\),其中 \(V=2^{30}\) 为值域。AC Code
ABC261F Sorting Color Balls
如果不管怎么交换都需要花费 \(1\) 的代价,那么我们知道答案就是逆序对个数。
这是因为每次交换至多减少一个逆序对,而有序的序列是不存在逆序对的。
现在同色交换不需要花费代价,那么大胆猜测答案就是总的逆序对个数减去同色的逆序对个数。
证明其实也很简单:考虑到每次交换至多减少一个逆序对,而交换同色时不需要花费任何代价,也就是说同色逆序对可以
白嫖免费消掉,那么减去这部分贡献就显得非常自然。
使用树状数组求逆序对即可,复杂度 \(O(N\log N)\)。AC Code
UPD:G 和 Ex 的题解见 AtCoder Beginner Contest 题目选解 中 ABC261G&ABC261Ex