Atcoder Beginner Contest 326 (ABC326)

不知道为什么拖到现在,我是摆怪。

A. 2UP3DOWN

模拟,略。

B. 326-like Numbers

模拟,略。

C. Peak

双指针板子。

D. ABC Puzzle

基础 dfs。
但是赛时不知道为什么觉得状态数不会很少,于是写了一个巨大复杂的状压。这里粗略算算有效状态数:
仅考虑每行的限制,有 (53)=10 种选择填数位置的方法。又因为第一个数填什么是固定的,选定位置后只有 2 种不同填法。那么每行的有效状态数为 20
也就是说总的状态数最多只有 205,当然这里没有考虑列的限制,实际上合法状态远比这个少。所以直接 dfs 是能过的。

E. Revenge of "The Salary of AtCoder Inc."

fi 表示游戏能进行到 x=i 的概率,则答案是 aifi
观察到 x 在游戏过程中单调递增,则有转移 fi=1nj=1i1fj

F. Robot Rotation

Description

有一个机器人位于坐标系原点 (0,0),面向 x 轴正方向。
在每一秒开始前,你可以选择让这个机器人向左或向右旋转 90 度,不可以不转。接下来,机器人沿它面对的方向前进 ai 个单位距离,i 为当前秒数。
给定总时间 N,序列 a 和机器人最终的位置 (X,Y)。请构造一个合法的操作序列(用 LR 表示每步操作的方向),或判断无解。

N80,ai107,109X,Y109

Solution

因为不能不转弯,可以发现机器人一定是横竖交替行走的。进一步观察,发现奇数秒机器人只改变 y 坐标,否则只改变 x 坐标。
那么 x,y 坐标是互不影响的,这启发我们把横纵坐标分开考虑。这里以横坐标为例,设序列 a 的所有偶数位组成序列 b
问题转化为给一个序列 b,可以自由选择每个 bi 的正负号,问是否存在方案使 X=bi
这看起来像是值域极大的 01 背包,显然不太可做。从数据范围的角度考虑问题,b 的长度至多只有 40
考虑将序列 b 拆成前后两部分,则每一半只有 20 个数,对应着 220 种状态。我们求出前一半的所有状态存进 map,在枚举后一半状态为 x 时判断 Xx 是否在 map 中存在即可。
时间复杂度 O(n4×2n4)

G. Unlock Achievement

完全没想到网络流(

Description

n 个技能,m 个成就。每个技能有一个等级,初始均为 1
你可以用 ci 块钱令技能 i 提升一个等级,该操作没有次数限制。
i 个成就达成的条件是对于 j[1,n],leveljLi,j,其中 levelj 表示第 j 个技能的等级。达成成就 i 后,你会获得 ai 元的奖励。注意这里奖励与成本是分开的,也就是说你不能用奖励的钱去提升等级。
请最大化获得的奖励与所需成本之差,并输出该值。

n,m50,1Li,j5,1ai,ci106

Solution

考虑构造最小割模型。

因为 Li,j5,把点 i 拆成 6 个点,分别为 idi,j(j[1,6])。令成就 i 为点 beli。则进行如下的建图:

  • 连接源点 sidi,6,容量为 inf
  • 连接 idi,j+1idi,j,容量为 ci×(j1),割掉这条边则表示将技能 i 升级到 j
  • 连接 idi,Lj,ibelj,容量为 inf
  • 连接 belit,容量为 ai。如果这条边被割掉,说明至少有一个技能的等级未达到该奖励的条件,不能获得奖励。

那么这个图的最小割就是成本与未获得的奖励之差,用总奖励减去最小割即为答案。

posted @   樱雪喵  阅读(211)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示