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\)的所需要删去的最小字符数。
那么有转移矩阵:

\[\begin{eqnarray*} D = \left[ \begin{array}{cccc} a_{0,0} & ... & a_{0,4} \\ a_{i,j-1} & a_{i,j} & a_{i,j+1} \\ a_{4,0} & ... & a_{4,4} \end{array} \right] \end{eqnarray*} \]

那么假设当前位置是\(2\),我们发现从\(0 \rightarrow 1\)这个状态是不需要删去当前字符的,但是从\(0 \rightarrow 0\)这个状态是需要删去当前字符的,转移矩阵有:

\[\begin{eqnarray*} D = \left[ \begin{array}{cccc} 1 & 0 & \infty & \infty & \infty \\ \infty & 0 & \infty & \infty & \infty \\ \infty & \infty & 0 & \infty & \infty \\ \infty & \infty & \infty & 0 & \infty \\ \infty & \infty & \infty & \infty & 0 \end{array} \right] \end{eqnarray*} \]

对于\(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\)中的出现方案数有:

\[\begin{eqnarray*} (n - p + 1) \cdot 26^{n - p} \end{eqnarray*} \]

并且要乘上它的价值\(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]\)限制下的好的子序列的个数

思路:
定义一个序列:

\[\begin{eqnarray*} b_i = \left\{ \begin{array}{cccc} 0 && a_i = a_{i - 1} \\ a_i && a_i \neq a_{i - 1} \end{array} \right. \end{eqnarray*} \]

那么每次查询\([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分治容斥即可。

posted @ 2019-09-09 09:24  Dup4  阅读(359)  评论(0编辑  收藏  举报