竞赛讨论区 > 【题解】wannafly挑战赛10
头像
牛客网小运营
编辑于 2018-12-27 14:45
+ 关注

【题解】wannafly挑战赛10

(题解由比赛出题人提供,点击右侧“本文相关内容”的题目即可开始做题)

T1 小H和迷宫
只要暴力枚举使用顺序即可,时空复杂度O(1)

T2 小H和密码
贪心确定每个密码盘选哪个字符是错误的,一个反例是:
a#
ba
c#
这个密码盘能够表示出密码ac
考虑DP,设F[i][j]表示前i个密码盘,有j个选了某个小写字母的方案,则决策只有当前密码盘选择空字符或者小写字母两种,用桶记录每个位置有哪些可用字母,询问串过长直接输出NO,时间复杂度O(N^2Q)

T3 小H和游戏
考虑问题的简化版本,每次轰炸只会影响和轰炸点距离不超过1的城市
转化成有根树上的问题,用F[]记录每个点被轰炸了多少次,G[]记录每个点的孩子被轰炸了多少次
轰炸时x更新F[x]和G[father[x]],查询时查询G[x],F[x]和F[father[x]]即可
要解决这个问题只需要稍作扩展即可,只要分别考虑自己,父亲节点,孩子节点,孩子节点的孩子,兄弟节点,父亲节点的父亲即可,注意不要重复计算贡献,时间复杂度O(N+Q)

T4 小H的询问
用线段树维护一个区间的和,区间是否有效,区间的左端和右端的奇偶性,区间左端和右端开始的最大的有效子区间的和,区间里最大的有效子区间的和,合并的时候分多种情况讨论一下即可。

T5 小H和棋盘
显然如果K≥N则输出-1
先考虑如果知道中心,如何快速判断整个点集是否关于它对称
定义一个偏序关系:点(x,y)小于点(a,b)当且仅当x<a或者x=a且y小于b,将所有点递增排序
可以发现无论对于哪个对称中心,所有点关于这个中心的对称点序列必然单调递减
所以只要使用two-pointers扫描即可在线性时间内判断
我们考虑枚举原点集内最小的满足对称点也在原点集内的点,可以知道这个点一定在原点集中最小的K+1个点之内,同理这个点的对称点一定在原点集中最大的K+1个点之内,这两个点确定了对称中心,也就是说,可能的对称中心不超过(K+1)^2个,我们只要暴力枚举,在判断时顺便求出有多少个点的对称点不在原点集内即可,时间复杂度O(K^2N)

T6 小H和遗迹
定义两个字符串A,B“前相似”,当且仅当A是B的前缀或B是A的前缀
定义两个字符串A,B“后相似”,当且仅当A是B的前缀或B是A的后缀
先证明结论:两个字符串可能相同,当且仅当A和B在第一个#之前的部分前相似,并且A和B在最后一个#之后的部分后相似
证明:结论的必要性显然,下证充分性
1.首先可以将A和B在第一个#之前的部分、A和B在最后一个#之后的部分都去掉而不影响结果,原因是:不妨设A在第一个#之前的部分是B在第一个#之前的部分的前缀,则他们都可以变成B#的形式,后面的部分同理
2.然后若A,B中有一个是单独的#,则显然成立
3.否则A开头必然是#X#的形式(X是任意字符串),同理B开头是#Y#,则可以将#X和#Y去掉而不影响结果,因为他们都可以变成XY#的形式,这就可以转第2步递归构造,得证
有了这个结论,我们可以把每个串在第一个#之前的部分和在最后一个#之后的部分分别插入到两棵Trie树中,两个串可能相同当且仅当他们对应的节点在两棵树上都是祖孙关系
我们可以通过在第一棵Trie树上进行一次DFS求解,每到一个节点就先统计它在另一棵树上对应的点的祖先和子树上的所有点的和并计入答案,再将它在另一棵树上对应的点加一,整个过程可以用DFS序+两个树状数组实现,时间复杂度O((Σlen)log(Σlen))

其他疑问可加以下交流群(加入一个即可啦~)
牛客多校算法训练营1:453799454
牛客全国算法训练营2:330766563
牛客多校算法训练营3:934889305

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐