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

posted @ 2022-07-23 21:49  云浅知处  阅读(421)  评论(7编辑  收藏  举报