AtCoder Beginner Contest 261 A-F 题解

官方题解太难读懂了QAQ,先写 A-F 的题解,后面的 G 和 Ex 蹲一个大佬的题解 awa。

A - Intersection

差分一下就行。

(也不知道是谁没测样例就交结果 WA 了一发)

Code

Submission

B - Tournament Result

枚举判断即可。

Code

Submission

C - NewFolder(1)

我打过的最简单的 C。直接 std::map<std::string,int> 存一下就行。

Code

Submission

D - Flipping and Bonus

发现状态很多,而且数据允许 \(O(NM)\) 的算法通过,考虑 DP。

预处理出得分为 \(i\) 时的额外奖励 \(a_i\)。(就是用桶存一下原题的 \(Y_i\))。

\(f(i,j)\) 表示第 \(i\) 轮得分为 \(j\) 时得到的最多钱数。

状态转移方程:

  • \(f(i,0)=\max\limits_{k=0}^{i-1}\{f(i-1,k)\}+a_0\)

  • \(\forall j \in [1,i],f(i,j)=f(i-1,j-1)+X_i+a_j\)

最后取最大值输出即可。

Code

Submission

E - Many Operations

看完题面,对于所有操作,显然二进制位与位之间没有任何影响,联想到 [NOI2014] 起床困难综合症 这个题,考虑按位拆分。

对于每一位,可以预处理出每次操作的影响。

具体而言,设 \(c(i,j)\) 表示当前位初始值为 \(j(j\in \{0,1\})\),进行前 \(i\) 次操作后的值。

\(op(j,i)\) 表示 \(j\) 经过第 \(i\) 次操作后的值。

不难推出式子:

  • \(c(i,0)=op(c(i-1,0),i)\)

  • \(c(i,1)=op(c(i-1,1),i)\)

然后就是统计答案,用一个变量 \(p\) 表示当前该位的值,\(p\) 初值为题中的 \(C\) 该位的值 。

遍历 \(1\sim n\),当遍历到 \(i\) 时,\(p\gets c(i,p)\),累加答案。

最后统一输出即可。

Code

Submission

F - Sorting Color Balls

如果不考虑颜色,这道题的答案显然就是逆序对的个数。

但现在有了限制,颜色相同时一次交换并不会产生代价。

也就是说,一个颜色相同的逆序对对答案没有任何影响。

那么我们可以先算出原序列里的逆序对个数,再用 std::vector 把每种颜色的值存一下,对于所有颜色算一遍逆序对,再用整个序列的逆序对数减去这个数即可。

Code

Submission

posted @ 2022-07-25 12:45  ImALAS  阅读(103)  评论(0编辑  收藏  举报