Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解。
【题目链接】
Wannafly 挑战赛 19 参考题解
命题:周甄陶
Problem A. 队列 Q
将操作离线倒序处理,可以线性效率解决这个问题。看代码很快就能懂了,不再赘述。
时间复杂度:$O(N + Q)$
Problem B. 矩阵
首先看一个问题:有一个长度为 $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 能写出很优美的旋律、很有思想的歌词一般。
这些年挺开心的,虽然从结果来看并没有做到很棒,但是我真的很享受这四年时光,我庆幸能够认识很多很多好朋友,无论是学习上、生活上,还是思想上、音乐上能聊得来的朋友们,我都很感谢很感谢。
对现在的状态呢,我也不是很完全满意,我还要继续努力。
恍若隔世的四年啊,真的犹如做了一场梦,我希望一直活在这场梦里,希望这场梦能越来越好。
最后,谢谢各位的参赛,祝所有朋友们前程似锦,心想事成!
Wannafly 挑战赛 19 参考题解的更多相关文章
- 牛客~~wannafly挑战赛19~A 队列
链接:https://www.nowcoder.com/acm/contest/131/A来源:牛客网 题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi ...
- 【牛客Wannafly挑战赛12】 题解
传送门:https://www.nowcoder.com/acm/contest/79#question 说是比赛题解,其实我只会前三题: 后面的一定补 T1 题意,在一个长度为n的时间内,问如何选择 ...
- Wannafly挑战赛19 B矩阵
矩阵 思路: 预处理好前缀和,枚举上边界和下边界,将二维变成一维,用单调队列找满足题意的最小前缀 复杂度,O(r*r*c) 代码: #pragma GCC optimize(2) #pragma GC ...
- Wannafly挑战赛19 A-队列Q
题目描述 ZZT 创造了一个队列 Q.这个队列包含了 N 个元素,队列中的第 i 个元素用 Qi 表示.Q1 表示队头元素,QN 表示队尾元素.队列中的元素是 N 的一个全排列. ZZT 需要在这个队 ...
- Wannafly挑战赛19:C. 多彩的树
传送门 $k$的范围非常小, $O(n2^k)$求出状态最多为$S$的路径数, 然后容斥. #include <iostream> #include <sstream> #in ...
- Wannafly挑战赛13 zzf的好矩阵 题解 答案解释
Wannafly挑战赛13 zzf的好矩阵 题解 文章目录 Wannafly挑战赛13 zzf的好矩阵 题解 分析 结论1 结论2 结论3 C数组对应带子说明 空白长度论述 后续黑色长度论述 能&qu ...
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- Wannafly挑战赛21A
题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...
- 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并
[Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...
随机推荐
- 洛谷 P2671 求和 解题报告
P2671 求和 题目描述 一条狭长的纸带被均匀划分出了\(n\)个格子,格子编号从\(1\)到\(n\) .每个格子上都染了一种颜色\(color_i\)用\([1,m]\)当中的一个整数表示),并 ...
- 算法-动态规划DP小记
算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...
- C&C++图形图像处理开源库
Google三维APIO3D O3D 是一个开源的 WebAPI 用来在浏览器上创建界面丰富的交互式的 3D 应用程序.这是一种基于网页的可控3D标准.此格式期望真正的基于浏览器,独立于操作系统之外, ...
- Stanford机器学习笔记-9. 聚类(K-means算法)
9. Clustering Content 9. Clustering 9.1 Supervised Learning and Unsupervised Learning 9.2 K-means al ...
- AngularJs分层结构小demo
后端mvc分层,前端也要分层才对嘛.分层的好处不言而喻.简直太清晰,容易维护.反正清爽的一逼.不信你看. 思路:分为controller层和service层.controller层再提取一个公共的层. ...
- [iOS]图片高清度太高, 导致内存过大Crash
先说一下状况, 后台提供的图片太高清了, 每个图片都在2-4MB, iOS上每个页面需要同时下载并展示10-15张. 这个时候, 如果我多滑动collectionView几次, 直接App就崩溃了(r ...
- [R语言]读取文件夹下所有子文件夹中的excel文件,并根据分类合并。
解决的问题:需要读取某个大文件夹下所有子文件夹中的excel文件,并汇总,汇总文件中需要包含的2部分的信息:1.该条数据来源于哪个子文件夹:2.该条数据来源于哪个excel文件.最终,按照子文件夹单独 ...
- python中的__enter__ __exit__
我们前面文章介绍了迭代器和可迭代对象,这次介绍python的上下文管理.在python中实现了__enter__和__exit__方法,即支持上下文管理器协议.上下文管理器就是支持上下文管理器协议的对 ...
- html中的body和head有什么区别??
我的html文件如下: <html> <title>这是我的测试</title> <head> my test </head> <bo ...
- web.xml 配置中classpath: 与classpath*:的区别——(十一)
首先 classpath是指 WEB-INF文件夹下的classes目录 解释classes含义: 1.存放各种资源配置文件 eg.init.properties log4j.properties s ...