The 2019 Asia Nanchang First Round Online Programming Contest
Contest Info
[Practice Link](https://www.jisuanke.com/contest/3870?view=challenges)
Solved | A | B | C | D | E | F | G | H | I |
---|---|---|---|---|---|---|---|---|---|
7/9 | - | O | Ø | - | O | Ø | O | O | Ø |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
B. Fire-Fighting Hero
\(Dijkstra\)模板题。
C. Hello 2019
题意:
给出一个字符串\(S\),每次询问一段子串\(S[l, r]\),问这段子串中最少删去多少个字符满足该子串中存在子序列\(2019\)不存在\(2018\)。
思路:
CF750E
定义\(5\)种状态\(\empty, 2, 20, 201, 2019\)。
定义\(a_{i, j}\)表示从\(i \rightarrow j\)的所需要删去的最小字符数。
那么有转移矩阵:
那么假设当前位置是\(2\),我们发现从\(0 \rightarrow 1\)这个状态是不需要删去当前字符的,但是从\(0 \rightarrow 0\)这个状态是需要删去当前字符的,转移矩阵有:
对于\(0\),从\(1 \rightarrow 2\)是不需要删去当前字符的,从\(1 \rightarrow 1\)是需要删去当前字符的
对于\(1\),从\(2 \rightarrow 3\)是不需要删去当前字符的,从\(2 \rightarrow 2\)是需要删除当前字符的
对于\(9\),从\(3 \rightarrow 4\)是不需要删去当前字符的,从\(3 \rightarrow 3\)是需要删除当前字符的
对于\(6\),从\(3 \rightarrow 3\)是需要删去当前字符的,从\(4 \rightarrow 4\)是需要删除当前字符的
对于其他数字,就\(a_{i, j}, i = j\)的时候设定\(0\),其他设定\(\infty\)即可。
但是矩阵的运算法则是\(C_{i, j} = \sum\limits_{k = 1}^n a_{i, k} \cdot b_{k, j}\),重新定义其运算方法为\(max(a_{i, k} + b_{k, j}) k \in [1, n]\)
E. Magic Master
F. Megumi With String
题意:
有一个字符串\(S\),以及一个长度为\(n\)的随机字符串\(T\)。
定义一个字符串\(t\)的价值为:
- 它是\(S\)的子串,那么它的价值为\(f(p)\),\(p\)是它的长度,\(f()\)为一个多项式。
- 否则,它的价值为\(0\)
定义字符串\(T\)的总价值为它的所有子串的价值,现在询问\(T\)的期望总价值,并且有\(q\)次操作,每次操作会在\(S\)后加一个字符,一共需要输出\(q + 1\)个答案。
第一个答案表示原串\(S\)对\(T\)的期望总价值。
后面的\(q\)个答案表示第\(i\)次操作后\(S\)对\(T\)的期望总价值。
思路:
\(n\)很大,我们考虑一个长度为\(p\)的\(S\)的子串的期望贡献,它在\(T\)中的出现方案数有:
并且要乘上它的价值\(f(p)\),令\(g(p) = (n - p +1) \cdot 26^{n - p} \cdot f(p)\)
那么我们只需要知道每次操作后有多少个长度为\(i\)的子串就可以了。
那么考虑增量法构建\(SAM\)的过程,每加入一个字符,会加入\(len[lst] - len[fa[lst]]\)个本质不同的字符串,并且它的长度为\([len[fa[lst]] + 1, len[lst]]\),那么预处理\(g(p)\)的前缀和即可。
G. Pangu Separates Heaven and Earth
签到。
H. The Nth Item
题意:
求广义斐波那契第\(n\)项,要求\(10^7\)次,但是给出的询问是一个随机数生成器,其生成方法为\(Q_i = Q_{i - 1} \cdot A_{i - 1}^2\),其中\(Q_i\)表示第\(i\)次询问,\(A_i\)表示第\(i\)次答案。
思路:
不能每次都做快速幂,但是考虑这个随机数生成器很弱,大概随机个\(10^4\)项就会随机到重复数字,那么就形成了循环。记录一下循环节即可。
I. Yukino With Subinterval
题意:
定义一个连续的子序列\([l, r]\)是好的:
- \([l, r]\)范围内的数都相等,并且满足\(i \in [L, R], x \leq a_i \leq y\)
- 在\([L, R]\)范围内该子序列应尽可能向左右扩展,扩展到不能扩展为止
现在给出一个序列\(a_i\),有两种操作: - 修改某个位置的数
- 询问\([L, R]\)范围内在\([x, y]\)限制下的好的子序列的个数
思路:
定义一个序列:
那么每次查询\([L, R, x, y]\)相当于查询\([L + 1, R]\)范围内值域在\([x, y]\)上的数,并且注意特判\(a_L\)的值是否在\([x, y]\)上,因为最左边那个数肯定会有一段,但是它的最左端点可能小于\(L\),但是它会提供贡献,所以特殊对待。
那么实际上是一个三维偏序问题,我们将询问拆成\([1, L - 1, 1, x - 1], [1, L - 1, 1, y], [1, R, 1, y], [1, R, 1, x - 1]\),然后CDQ分治容斥即可。