不知道为什么拖到现在,我是摆怪。
A. 2UP3DOWN
模拟,略。
B. 326-like Numbers
模拟,略。
C. Peak
双指针板子。
D. ABC Puzzle
基础 dfs。
但是赛时不知道为什么觉得状态数不会很少,于是写了一个巨大复杂的状压。这里粗略算算有效状态数:
仅考虑每行的限制,有 \(\binom{5}{3}=10\) 种选择填数位置的方法。又因为第一个数填什么是固定的,选定位置后只有 \(2\) 种不同填法。那么每行的有效状态数为 \(20\)。
也就是说总的状态数最多只有 \(20^5\),当然这里没有考虑列的限制,实际上合法状态远比这个少。所以直接 dfs 是能过的。
E. Revenge of "The Salary of AtCoder Inc."
设 \(f_i\) 表示游戏能进行到 \(x=i\) 的概率,则答案是 \(\sum a_i f_i\)。
观察到 \(x\) 在游戏过程中单调递增,则有转移 \(f_i=\frac{1}{n} \sum\limits_{j=1}^{i-1} f_j\)。
F. Robot Rotation
Description
有一个机器人位于坐标系原点 \((0,0)\),面向 \(x\) 轴正方向。
在每一秒开始前,你可以选择让这个机器人向左或向右旋转 \(90\) 度,不可以不转。接下来,机器人沿它面对的方向前进 \(a_i\) 个单位距离,\(i\) 为当前秒数。
给定总时间 \(N\),序列 \(a\) 和机器人最终的位置 \((X,Y)\)。请构造一个合法的操作序列(用 L
和 R
表示每步操作的方向),或判断无解。
\(N\le 80,\,a_i\le 10^7,\,-10^9\le X,Y\le 10^9\)。
Solution
因为不能不转弯,可以发现机器人一定是横竖交替行走的。进一步观察,发现奇数秒机器人只改变 \(y\) 坐标,否则只改变 \(x\) 坐标。
那么 \(x,y\) 坐标是互不影响的,这启发我们把横纵坐标分开考虑。这里以横坐标为例,设序列 \(a\) 的所有偶数位组成序列 \(b\)。
问题转化为给一个序列 \(b\),可以自由选择每个 \(b_i\) 的正负号,问是否存在方案使 \(X=\sum b_i\)。
这看起来像是值域极大的 01 背包,显然不太可做。从数据范围的角度考虑问题,\(b\) 的长度至多只有 \(40\)。
考虑将序列 \(b\) 拆成前后两部分,则每一半只有 \(20\) 个数,对应着 \(2^{20}\) 种状态。我们求出前一半的所有状态存进 map
,在枚举后一半状态为 \(x\) 时判断 \(X-x\) 是否在 map
中存在即可。
时间复杂度 \(O(\frac{n}{4}\times 2^{\frac{n}{4}})\)。
G. Unlock Achievement
完全没想到网络流(
Description
有 \(n\) 个技能,\(m\) 个成就。每个技能有一个等级,初始均为 \(1\)。
你可以用 \(c_i\) 块钱令技能 \(i\) 提升一个等级,该操作没有次数限制。
第 \(i\) 个成就达成的条件是对于 $\forall j\in [1,n],level_j \ge L_{i,j} $,其中 \(level_j\) 表示第 \(j\) 个技能的等级。达成成就 \(i\) 后,你会获得 \(a_i\) 元的奖励。注意这里奖励与成本是分开的,也就是说你不能用奖励的钱去提升等级。
请最大化获得的奖励与所需成本之差,并输出该值。
\(n,m\le 50,\, 1\le L_{i,j}\le 5,\, 1\le a_i,c_i\le 10^6\)。
Solution
考虑构造最小割模型。
因为 \(L_{i,j}\le 5\),把点 \(i\) 拆成 \(6\) 个点,分别为 \(id_{i,j}(j\in [1,6])\)。令成就 \(i\) 为点 \(bel_i\)。则进行如下的建图:
- 连接源点 \(s\) 与 \(id_{i,6}\),容量为 \(\inf\)。
- 连接 \(id_{i,j+1}\) 与 \(id_{i,j}\),容量为 \(c_i\times (j-1)\),割掉这条边则表示将技能 \(i\) 升级到 \(j\)。
- 连接 \(id_{i,L_{j,i}}\) 与 \(bel_j\),容量为 \(\inf\)。
- 连接 \(bel_i\) 与 \(t\),容量为 \(a_i\)。如果这条边被割掉,说明至少有一个技能的等级未达到该奖励的条件,不能获得奖励。
那么这个图的最小割就是成本与未获得的奖励之差,用总奖励减去最小割即为答案。