【题解】牛客练习赛 68 题解
A
注意条件
代码链接:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=44866335
B
发现当
于是我们只需要预处理 n < 199999 的答案就好了。可以推式子或者前缀和处理。
代码链接:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=44866341
C
我们考虑单组询问 L 怎么做:实际上就是把所有
那么多组询问就可以都离线下来,把询问和边放在一起排序然后处理就好了。
其实在线也可以做:处理处加入每条边后的答案,询问的时候只需要找到最后一个
代码链接:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=44866360
D
首先我们发现每个位置本质是一样的,所以如果我们想求第 i 个位置开始的粉丝经过 T 时间到达第 j 个位置的粉丝的期望人数可以整体平移到起点为 0 的情况,所以我们只需要处理起点为 0 的情况就好了。
考虑暴力:设
转移是
直接暴力矩阵乘法转移是
发现转移是一个循环矩阵,并且循环矩阵对矩阵加法和乘法都封闭,于是我们存一个矩阵只需要存第一行,矩阵乘法的时候只需要考虑维护出乘法后的矩阵第一行的数是什么就好了,复杂度优化到
。
本来这个题是 C 题的但是感觉还是太难了所以放了个简单题上去。。
E
考虑一个暴力的 dp:设
我们修改转移的限制:我们只需要要求 [j+1,i] 能被划分成回文串就可以了,不难发现在最优性的限制下答案不会改变。
那么我们考虑有哪些串不能被划分呢?实际上很少:
1. aaaaaaaaa
2. ababababa
3. aaaabaaaa
简要证明:
首先如果本身不是回文串 不需要划分,所以我们只需要考虑回文串的情况:
首先我们证明对于
接下来我们发现
1. 长度为偶数
2. s[n/2]=s[n/2+1]
我们考虑在 n/2-1 处划分 即可满足题意。
于是我们考虑修正后的状态如何转移:
1. 能转移过来的状态是一个前缀 预处理前缀 max 即可
2. 是和奇偶性有关的一个前缀 分奇偶性维护前缀 max
3. 显然只有一个 这个需要注意 他可能会混入 2 情况的转移 所以我们还需要维护次 max 和它们的位置
时间复杂度 O(n)
代码链接:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=44866372
F
我们定义
我们如果能求出一个
然后我们观察一些性质:我们发现如果代入 F(p) 可以得到:
所以发现对于一个 x ,设
那么 H(x) 不为 0 的部分有多少呢?我们可以考虑所有满足
>证明:因为任何一个
所以这样的数的个数有:
所以我们只需要爆搜出所有这样的数,然后拉格朗日插值快速算一下 G 的前缀和就好了。(实际操作的时候可以预处理
如果我们对于
大概估计一下复杂度:首先拉格朗日插值对于一个 H 有值的地方 x,查询的是
那么首先如果一个数如果对插值复杂度有贡献,要满足
代码链接:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=44866385