【题解】牛客挑战赛39

萌新出题人第一次出题,没把握好难度,被A穿了,十分抱歉

B题题面出了一些小锅,我已经帮大家喷过出题人了= =,如果大家有啥想喷的,欢迎私信我,我一定转达(雾

B会把之前wa的代码按原错题rejudge

A.聚会

显然一个传送门放在 ,另一个传送门放在位置 非 0 的位置是最优的,否则我们将一个传送门挪到 一定可以使得使用传送门的朋友们更快到达聚会地点。

剩下能放传送门只有一个,只能放在 或者 位置才有收益。

当所有朋友的家都在 (或 )时,我们可以发现,假设传送门放在位置 ,对于所有 的朋友,走传送门比不走传送门速度更快,而 的朋友则需要讨论走到传送门更快还是直接奔向原点更快(因为传送门和原点在两个方向)。将朋友位置按 坐标排序并重新编号后,不难发现一定存在一个编号 使得编号 的朋友直接走向原点,而编号 的朋友们走向传送门。那么我们可以枚举这个前缀 ,让 的朋友直接走向原点,让剩下人走向传送门,问题转换为如何摆传送门,让 的朋友同时出发到达传送门的时间最短,注意题目要求只能摆在整点位置,容易发现摆在它们的中间位置是最优的。

当存在朋友的家 也存在朋友的家 时,需要分别讨论一下传送门放在哪一侧,计算其中一侧的朋友,另外一侧的朋友直接走向原点,最后取耗时更小的方案。

这个题也存在其它做法,方法大同小异。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43467561

B.密码系统

不难发现从某个起点 开始进行 段划分后,划分后的子串头部在原串位置的下标 都相同,例如baca,若划分为baca,则bc对应下标为 ,在取模 意义下都是 ,而若划分为acab,其中a对应下标分别是 ,在取模 意义下都是 。因此原串下标按 分组后,每一组的所有下标就是划分后子串的起始位置。

一种做法是对原串复制一遍后建立后缀数组,由后缀数组定义,rank 数组按 分组后每组内的最大值就对应着每种划分的字典序最大的子串(备选密码),最后在所有备选密码中选取对应 rank 的最小值就是所有备选密码中字典序最小的密码。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43467562

C.牛牛的等差数列

比较经典的线段树问题

由于一个等差数列加上另一个等差数列,得到的还是一个等差数列,考虑对于线段树每个区间维护一个等差数列的首项和公差以及区间和,在push_down的时候可以的计算出左右区间的公差首项以及增加的区间和,对于取模操作,只要维护区间的和对取模,最后得到答案的时候再取一次模即可。

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43467563

D.牛牛的数学题

本题分为三个部分来分别处理

第一部分为 ,这部分可以通过子集卷积来解决

第二部分为,这部分可以通过NTT来解决

第三部分为,这部分可以通过FWT来解决

分步来处理之后更新答案即可

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43467570

E.牛牛与序列

不妨考虑容斥。不难知道,个位置,每个位置填,总的填法是。对于所有不合法序列,先除去所有数字都相同的序列(一共个),其他的都是长度为的不下降或不上升序列。去掉的种既是不下降的又是不上升的。

显然不上升与不下降是对称的。只要求长度为,每个位置填的不下降序列的方案数即可。

个位置,最后一个位置填数字的方案数。显然有。那么最后的就是。打个的表容易发现就是个斜着的杨辉三角,然后随便写个什么求组合数的就过了,出题人太鶸了

,定义,那么可以对做前缀和得到,显然可以用组合数直接表示。

以下用数学归纳法证明

  • 时,显然只有填一个数字的唯一方案,,成立。

  • 成立,当时,。展开得,因为,所以可改写成。反复使用帕斯卡公式()变换,得到

    所以

最后, 不下降序列总方案数为

所以答案为

由于范围较大,所以需要对稍微约分一下,显然实际需要乘进去的项不超过

时间复杂度

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43467573

F.树与异或
由于查询是离线的,两种询问可以分开做。

对于查询链上权值种类数,直接树上莫队即可。

对于查询链上权值是z的倍数的点个数,首先把1个询问拆成不超过3个的点到根的询问。考虑暴力枚举每种z,再把所有z的倍数加入计算。不难知道1e5以内的数的因子数规模最多约个。同时,每把一个点加入统计,影响的是这个点子树内的点到根的所有询问,此时答案+1。用dfs序+树状数组维护即可。

时间复杂度。但并不是每一种z都能达到的上界。

还可以对询问的z分块,对于,直接dfs处理表示点i到根的路径上点权是j的倍数的点个数,当作答案。对于,仍然枚举z的倍数。但此时z的倍数不会超过个,加上树状数组复杂度为

时间复杂度

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43467576

写在最后
由于出题人太菜了,可能有些题目比较板,如果以后还有机会出题一定会注意,如果大家有什么意见建议或者想来喷出题人,欢迎加我QQ:623418780,最后再次为B题出现的失误向大家道歉,原谅我吧,ball ball you,泪目.jpg

全部评论
草,这个F题显然是二合一吧。。。 而且复杂度可以做到标准的根号
1 回复 分享
发布于 2020-04-17 22:39
第二题后缀排序卡二分 + 哈希吗?
点赞 回复 分享
发布于 2020-04-17 22:25
“如果以后出题一定不会注意”是什么鬼
点赞 回复 分享
发布于 2020-04-17 22:25
E题f[i][j]不直接插板就可以证明了?
点赞 回复 分享
发布于 2020-04-17 22:26
B 题后面是重测了吗,为啥我之前的二分 + 哈希又过了?
点赞 回复 分享
发布于 2020-04-17 22:30
为啥A题二分两次,对[最小元素,0)二分一次对[0,最大元素+1)二分一次是不行的 https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43467425 能不能发我一下卡掉的那组数据,我看一下。
点赞 回复 分享
发布于 2020-04-17 22:38
我的B题暴力O(nk) rejudge 后竟然过了。。其实不应该的 https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43464442
点赞 回复 分享
发布于 2020-04-17 22:42
D子集卷积不会,我就暴力枚举子集,发现3^17也就一亿多点,常数也挺小,然后就直接艹过去了
点赞 回复 分享
发布于 2020-04-17 23:21
F题第二部分既然可以离线,可不可以在dfs的过程中维护当前节点到根节点的每个数字的倍数个数,这样时间复杂度不就是两个log的吗
点赞 回复 分享
发布于 2020-04-17 23:37
C怎么这么卡常啊,怎么改都A不了:代码:https://paste.ubuntu.com/p/ZJ86rk6RF9/
点赞 回复 分享
发布于 2020-04-18 00:51
出题人加油期待以后带来更好的比赛
点赞 回复 分享
发布于 2020-04-18 08:27
最后一题的第二问实际上并不需要树状数组... dfs前缀作差就好了
点赞 回复 分享
发布于 2020-04-18 10:21
用java写的B题死活过不了,能看一下是什么问题吗? https://ac.nowcoder.com/discuss/411305?type=101&order=0&pos=2&page=1
点赞 回复 分享
发布于 2020-04-18 17:26
大佬能看一下C题为什么只能通过25%吗,感觉没啥错呀,或者能提供一份hack数据吗https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43508296
点赞 回复 分享
发布于 2020-04-18 17:38

相关推荐

不愿透露姓名的神秘牛友
11-27 10:48
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务