test 200502
T1 商店购物
得分情况
期望:0
实际:0
改后:100
题意
在 Byteland 一共开着 n 家商店,编号依次为 1 到 n,其中编号为 1 到 m 的商店有日消费量上限,第 i 家商店的日消费量上限为 w i 。
Byteasar 每次购物的过程是这样的:依次经过每家商店,然后购买非负整数价格的商品,并在结账的时候在账本上写上在这家商店消费了多少钱。当然,他在这家商店也可以什么都不买,然后在账本上写上一个 “0”。
这一天,Byteasar 日常完成了一次购物,但是他不慎遗失了他的账本。他只记得自己这一天一共消费了多少钱,请写一个程序,帮助 Byteasar 计算有多少种可能的账单。
犯傻原因
可能一开始推公式没什么思路就直接跳过了,后来一直在调试后面的题目就没怎么管了。
正解
考虑 DP,设 (f[i][j]) 表示考虑了前 i 个商店,目前选的商店的上限 +1 之和为 (j) 时的贡献。
如果这个商店不选,那么有 (f[i][j]+ = f[i − 1][j]),否则有(f[i][j]− = f[i − 1][j − w[i] − 1])。
(sum ans = sum_i f[n][i]C_{k + n − 1 − i}^{ n − 1})。
时间复杂度 (O(n + k + m^2 w))。
T2 公路建设
得分情况
期望:30
实际:30
改后:100
题意
在 Byteland 一共有 (n) 个城市,编号依次为 (1) 到 (n) ,它们之间计划修建 (m) 条双向道路,其中修建第(i) 条道路的费用为 (c_i) 。
Byteasar 作为 Byteland 公路建设项目的总工程师,他决定选定一个区间 [l, r],仅使用编号在该区间内的道路。他希望选择一些道路去修建,使得连通块的个数尽量少,同时,他不喜欢修建多余的道路,因此每个连通块都可以看成一棵树的结构。
为了选出最佳的区间,Byteasar 会不断选择 (q) 个区间,请写一个程序,帮助 Byteasar 计算每个区间内修建公路的最小总费用。
犯傻原因
就一直在那推可能的算法,预处理什么的都想了想还是没想到怎么实现,然后就凉凉写了个暴力了……
正解
考虑用线段树直接维护每个区间的答案。
注意到一个区间最多只有 (n − 1) 条树边有用,所以线段树每个节点按权值从小到大保存区间内用到的树边即可。
合并两个区间的信息时,只需要将树边归并,然后做Kruskal 算法。
时间复杂度 (O((m + q log m)n alpha(n)))。
T3 航海舰队
得分情况
期望:30
实际:20
改后:
题意
Byteasar 组建了一支舰队!他们现在正在海洋上航行着。
海洋可以抽象成一张 (n imes m) 的网格图,其中有些位置是 “.”,表示这一格是海水,可以通过;有些位
置是 “#”,表示这一格是礁石,不可以通过;有些位置是 “o”,表示这一格目前有一艘舰,且舰离开这
一格之后,这一格将变为 “.”。
这些 “o” 表示 Byteasar 的舰队,他们每天可以往上下左右中的一个方向移动一格,但不能有任何一
艘舰驶出地图。
特别地,Byteasar 对阵形有所研究,所以他不希望在航行的过程中改变阵形,即任何时
刻任何两艘舰的相对位置都不能发生变化。
Byteasar 的舰队可以航行无限长的时间,每当一艘舰经过某个格子的时候,这个格子海底的矿藏都
将被 Byteasar 获得。
请写一个程序,帮助 Byteasar 计算他最多可以获得多少个格子海底的矿藏?
犯傻原因
大概还是不会……
写了个暴力……
然后30-60分没来得及打完就考试结束了就放弃了……
然后还不知道为什么无缘无故T了一个点真的服了自己
正解
首先抠出包围了阵形的最小矩形。
将地图拉伸成一条链,即将第一行、第二行、第三行按顺序连接。阵形也可以用同样的方法处理。
那么问题转化为,给定两个 01 串 S 和 T,问每个 S 中长度为 |T| 的子串是否存在一个点,两个串对应字符都是 1。
将 T 串翻转,那么就变成了卷积的形式,FFT 计算即可。
在 BFS 求出所有可行的位置之后,对于答案的计算,也是卷积的形式,用 FFT 加速即可。
时间复杂度 (O(nm log(nm)))。
考试总结
想题目的时候思路要清晰些,题目思路断了可能导致浪费很长的的一段时间。