牛客挑战赛60 题解
A 第三心脏
令若质数
时间复杂度
。其中
是值域。
B 尖端放电
考虑到当一个点被攻击第二次时我们就找到一个答案了,否则会至少覆盖一个新的点,所以直接暴力枚举所有点对直到找到答案即可。时间复杂度
C 格点染色
设- 如果
在
中是最后一个被染色的,那么方案数为
。
- 如果
在
中不是最后一个被染色的,在
中,对于
,令
为
前一个染色的点,那么有
,因此可以把
放在
与
之间染色,
是第一个染色的点时同理。因为
共有
个取值,所以方案数为
。
时间复杂度
D 三千道路
一张竞赛图中两个点有三连通关系:-
能到达
,
不能到达
。
-
不能到达
,
能到达
。
-
能到达
,
能到达
。
充分性:当它的拓扑序唯一时我们之间前面的强联通分量都向后面的连即可。
必要性:若它的拓扑序不唯一,那么我们一定能找到两个强连通分量使得它们之间无法互相到达。
所以跑拓扑排序的时候判断是否任意时刻队列大小不超过一即可。
时间复杂度
E 字典树简单题
有一个显而易见的结论:对于任意一个节点证明的话,考虑
所以说其实只需要找到
可以用 LCT 维护每个点子树内叶子数量。对于加点操作,只需要把点
对于询问操作,将点
如果没有加点操作,那么可以将叶子按照 dfs 序排序,然后对于 01 Trie 上的每一个点记录它子树内 dfs 序最小的叶子节点。那么
有了修改操作后,注意到加点并不会影响其他叶子排名的相对顺序,所以相当于需要支持在序列中插入一个数,并动态维护 01 Trie 上每一个结点子树内排名最小的叶子的编号。为了方便,下文称一个点
在序列中插入一个数这个很简单,再用一棵平衡树维护序列即可。
对于 LCT 上的每一个点再维护一个值表示 01 Trie 上这个点的最小叶子。考虑一次加点操作的影响。首先新加的点的子树内只有新加的叶子,而对于原本就在 01 Trie 上的点
-
是
的祖先。
-
与新建点之间的边的权值为
,且
到
之间的边权值均为
。
可以在 Splay 上二分找到这个
维护好每一个点的最小叶子后,询问时只需要在平衡树上查询最小叶子的排名
时间复杂度
F 再见***与胖头鱼
当上次和这次攻击的胖头鱼不同时才会加一次攻击,显然所有胖头鱼都是一样的,所以我们可以只考虑一只胖头鱼造成的期望伤害。构造多项式
考虑到转移到下一条鱼时的概率是由上一条被攻击的连续次数决定,所以这个概率在每个
首先指定一只胖头鱼计算它的期望伤害,定义多项式
那么多项式
然后我们枚举破坏圣盾的次数,那么造成的伤害(
设
考虑用多项式计算
由于最后一段就结束了,此时不需要算上转移到另一条鱼上的概率,所以还需要一个
那么
然后转到求答案就是
用等比数列的通项公式可以化为
多项式计算即可。时间复杂度