AtCoder Beginner Contest 261 A-F 题解
作者:互联网
官方题解太难读懂了QAQ,先写 A-F 的题解,后面的 G 和 Ex 蹲一个大佬的题解 awa。
A - Intersection
差分一下就行。
(也不知道是谁没测样例就交结果 WA 了一发)
Code
B - Tournament Result
枚举判断即可。
Code
C - NewFolder(1)
我打过的最简单的 C。直接 std::map<std::string,int>
存一下就行。
Code
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
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
F - Sorting Color Balls
如果不考虑颜色,这道题的答案显然就是逆序对的个数。
但现在有了限制,颜色相同时一次交换并不会产生代价。
也就是说,一个颜色相同的逆序对对答案没有任何影响。
那么我们可以先算出原序列里的逆序对个数,再用 std::vector
把每种颜色的值存一下,对于所有颜色算一遍逆序对,再用整个序列的逆序对数减去这个数即可。
Code
标签:AtCoder,Code,颜色,Submission,题解,261,op,逆序 来源: https://www.cnblogs.com/663B/p/16517048.html