这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来讲好像都不是特别友好,可是我的感受题目质量仍是过得去的,下面是题目连接以及题解。html
【题目连接】算法
Wannafly 挑战赛 19 参考题解ubuntu
命题:周甄陶学习
Problem A. 队列 Qspa
将操做离线倒序处理,能够线性效率解决这个问题。看代码很快就能懂了,再也不赘述。code
时间复杂度:$O(N + Q)$htm
Problem B. 矩阵blog
首先看一个问题:有一个长度为 $N$ 的序列 $A$,对于每个位置 $i$,计算以 $i$ 位置为结尾的最大子串和,且子串的左端点位置必须大于等于 $L_i$。数据保证 $L_i$ 是非递减的。队列
设 $S_i$ 为 $A$ 的前缀和,则以位置 $i$ 为结尾的子串和为 $S_i - S_j$,在区间 $[L_i - 1, i]$ 内枚举位置 $j$ 找到 $S_j$ 的最小值就能够计算出以 $i$ 为结尾的最大子串和。这个问题利用单调队列是能够 $O(N)$ 解决的。字符串
上述问题解决后,再来看这题:
能够枚举答案矩阵的上下边界,处理成一维的,题目中的第二个约束和第三个约束能够处理出 $L_i$, 以后的问题就变成了上述那个问题了。
时间复杂度:$O(R*C*C)$
Problem C. 多彩的树
一棵 $P$ 个节点的树中,路径数总共有 $P + { C }_{ P }^{ 2 }$ 条。
将颜色进行状压,$T_i$ 表示颜色集合小于等于 $i$ 的路径数量,计算 $T_i$ 只要保留颜色是状态 $i$ 中的节点,求连通块后,每一个连通子树计算方案数累加便可。
获得 $T_i$ 以后,能够经过减去子集的路径数量,获得颜色集合刚好为 $i$ 的路径数量。
时间复杂度:$O(2^K*N)$
Problem D. 回文
先考虑答案的来源:确定是以某个位置为回文中心,留下最长回文半径,而后单边保留一些或不保留字符,而后砍掉多余部分,最后在另外一侧补全,使得字符串成为回文串。
上述思路能够用 manacher 以及记录一些值的前缀后缀的最小值来实现。
时间复杂度:$O(|S|)$
Problem E. 集合
这题代码量有一点大,容易写错,思路自己并不难。
$cost_{i,j}$ 表示 $A$ 集合的第 $i$ 个元素和 $B$ 集合的第 $j$ 个元素,经过修改操做变换成相同的元素,须要的花费为 $cost_{i,j}$,若没法经过修改操做变成相同的元素,则 $cost_{i,j}$ 为 inf。$cost_{i,j}$ 能够经过广度优先搜索来获得。
接下来就是一个二分图最小费用匹配问题,能够用最小费用最大流来解决。
源点向 $A$ 集合的每个元素 $i$ 建边,流量为 $1$,费用为 $0$。
$B$ 集合的每个元素 $j$ 向汇点建边,流量为 $1$,费用为 $0$。
$A$ 集合的每个元素 $i$ 向 $B$ 集合的每个元素 $j$ 建边,流量为 $1$。若是 $cost_{i,j}$ 为 inf,则费用为 $da_i + db_j$,表示这两个元素配对的方式只能是二者都删除;若是 $cost_{i,j}$ 不为 inf,那么费用为 $\min(da_i + db_j, cost_{i,j} * \min(ma_i, mb_j))$,表示这两个元素配对能够选择变换也能够选择直接删除,选择少的那一种费用。
此外,在元素个数较少的那一侧,还须要新增一个节点 $P$,用来删除另外一侧多余元素。若是是 $A$ 集合的元素比 $B$ 集合的元素少,那么源点和 $P$ 之间建边,流量为 $|B-A|$,费用为 $0$;$P$ 和 $B$ 集合中的每个元素 $j$ 建边,流量为 $1$,费用为 $db_j$。
上述图,从源点到汇点跑最小费用最大流,跑出来的费用即为答案。
时间复杂度:$O(N * { C }_{ 16 }^{ 8 } * 16^2 + F*V*E)$,其中前半部分为 bfs 计算 $cost$ 的复杂度,后半部分为最小费用最大流的复杂度。
Problem F. K 串
$S_{i,j}$ 表示前缀 $[1,i]$ 中,第 $j$ 种字母的数量对 $K$ 取模的结果。每一个位置的 $S_i$ 均可以看做是一个 $26$ 元组,每次询问就至关于询问区间 $[L, R]$ 中有多少对相同的 $26$ 元组。
能够将 $26$ 元组进行 hash 成一个数字或者能够将 $26$ 元组插入字典树进行操做。以后就是《小 Z 的袜子》了,利用莫队算法便可。
hash 作法的时间复杂度:$O(N\sqrt { N } \log { N } )$
字典树作法的时间复杂度:$O(N\sqrt { N } * 26)$
-----------
写在入职前:
毕业 20 来天了,我这个蒟蒻呢,明天就要入职微软苏州了。这场比赛以及三月份的校赛命题是我离开学校、上班以前对大学 ACM 算法竞赛生涯的两次总结,对于命题,我彻底把它当作是一种创做而非任务,我想创做出很优秀、很回味无穷的试题,犹如 Vae 能写出很优美的旋律、颇有思想的歌词通常。
这些年挺开心的,虽然从结果来看并无作到很棒,可是我真的很享受这四年时光,我庆幸可以认识不少不少好朋友,不管是学习上、生活上,仍是思想上、音乐上能聊得来的朋友们,我都很感谢很感谢。
对如今的状态呢,我也不是很彻底满意,我还要继续努力。
恍若隔世的四年啊,真的犹如作了一场梦,我但愿一直活在这场梦里,但愿这场梦能愈来愈好。
最后,谢谢各位的参赛,祝全部朋友们前程似锦,心想事成!