The Preliminary Contest for ICPC Asia Shanghai 2019

Contest Info


[Practice Link](https://www.jisuanke.com/contest/3003?view=challenges)
Solved A B C D E F G H I J K L
7/12 - O Ø O - Ø O - - O - O
  • O 在比赛中通过
  • Ø 赛后通过
  • ! 尝试了但是失败了
  • - 没有尝试

Solutions


B. Light bulbs

离散化之后差分。

C. Triple

题意:
有三个序列\(a_i, b_i, c_i\),现在要统计\((i, j, k)\)三元组的个数,要求\((i, j, k)\)满足:

\[\begin{eqnarray*} |A_i - B_j| &\leq& C_k \\ |B_j - C_k| &\leq& A_i \\ |A_i - C_k| &\leq& B_j \end{eqnarray*} \]

$1 \leq n, a_i, b_i, c_i \leq 10^5, $

思路:
考虑暴力怎么做?
将三个数放在一起排序,按顺序枚举排序后的数\(i\)作为最大值的答案,然后再枚举剩下两种数中的一种,然后可以发现第三种数可以选择的是一段范围,那么用个指针维护一下可选范围即可。
时间复杂度\(O(n^2)\)

考虑\(FFT\)怎么做?
我们可以枚举一种数(假设为\(a_i\))作为最大值,然后将\(b_i, c_i\)进行\(FFT\)组合。然后统计\(b_i + c_i \geq a_i\)的方案数即可。
但是我们发现,\(FFT\)组合出的方案中有不合法的方案,因为我们钦定了\(a_i\)最大,但是\(FFT\)组合中有可能是\(b_j > a_i, c_k > a_i\)进行组合得到的方案,但是我们只想要\(b_j \leq a_i, c_k \leq a_i\)进行组合得到的方案。
这种不合法的方案我们后面减去就可以了。
我们先做\(3\)\(FFT\),分别枚举\(a_i, b_i, c_i\)作为最大值得到的方案数。
然后将三种数放在一起排序,减去不合法的方案。
我们枚举当前数,假设它是\(a_i\),那么不合法的就是\(b_j > a_i\)或者\(c_k > a_i\)进行组合得到的方案,将或者拆成三个条件减去贡献即可,从左往右遍历的时候顺便维护一下每种数出现了几个,就可以\(O(1)\)算出当前数右边有其他两种数的个数

这里考虑了两种数相等的情况的重复方案数吗?
其实是考虑了的,将上面不合法的情况\(b_j > a_i\)或者\(c_k > a_i\)中的大于号看成是相对位置在它右边的,也就是强制给相同的数一个不同的\(rank\),那么有相同的数组合出来的情况肯定会在相对位置大的那个数那里被统计答案。

D. Counting Sequences I

题意:
考虑一个长度为\(n\)的序列\(a_i\),问满足如下条件的序列有多少个。

  • \(n \geq 2\)
  • \(a_1 + a_2 + \cdots + a_n = a_1 \cdot a_2 \cdots a_n\)

思路:
考虑枚举\(a_i\)中非\(1\)的数,考虑这样的数的个数很少,暴力\(DFS\)

G. Substring

题意:
定义\(S\)\(T\)新的匹配方式:

  • \(|S| = |T|\)
  • \(S_1 = T_1, S_n = T_n\)
  • \(S\)中每种字母的个数和\(T\)中每种字母的个数相同

现在给出一个主串\(S\),和\(m\)次询问,每次询问一个模式串在\(S\)中的所有子串中,匹配上了多少次,保证\(\sum |T| \leq 10^5\)

思路:
考虑\(Hash\),我们发现对于同一种长度的询问可以一起处理,滑动窗口处理主串该长度的\(Hash\)值,存入\(mp\),然后查表即可。
考虑一共有多少种不同的长度?
最坏的情况下就是\(1 + 2 +\cdots\),差不多是\(\sqrt{10^5}\)

F. Rhyme scheme

题意:
定义一个长度为\(n\)的字符串,每个位置需要满足当前位置的大小小于等于它前面那个字母的最大值\(+1\),问字典序第\(k\)大的字符串是多少。

思路:
其实是个集合划分的字符串表示,方案总是数贝尔数。
那么考虑预处理一个\(dp\)\(f[n][i][j]\)表示长度为\(n\),当前在第\(i\)位,最大值为\(j\)的所有后缀的方案数是多少。
那么显然有\(f[n][n][j] = 1\),那么考虑倒着推上去。
那么有:

\[\begin{eqnarray*} f[n][i][j] = f[n][i +1][j] * j + f[n][i + 1][j + 1] \end{eqnarray*} \]

表示下一个字符放\(1 - j\)的方案数为\(f[n][i + 1][j]\),如果放\(j + 1\)那么其方案数为\(f[n][i + 1][j + 1]\)
然后从左往右逐位确定即可。

J. Stone game

题意:
\(n\)个石头集合\(S\),现在\(CSL\)要选择若干个石头,假设它选择的石头集合为\(S'\),要满足如下条件:

\[\begin{eqnarray*} (Sum(S') \geq Sum(S - S')) \; and \; (\forall t \in S', Sum(S') - t \leq Sum(S - S')) \end{eqnarray*} \]

\(CSL\)有多少种选择方式。

思路:
显然对于第二个条件,如果\(t\)\(S'\)的最小值都满足的话,那么肯定满足。
那么枚举\(CSL\)选择的石头中的最小值,那么其他的石头只能取大于等于这个石头的石头。
会发现是可行解是关于\(sum\)的一段范围,背包即可。

L. Digit sum

预处理即可。

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