Processing math: 1%

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

题意:
有三个序列ai,bi,ci,现在要统计(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进行组合得到的方案。
这种不合法的方案我们后面减去就可以了。
我们先做3FFT,分别枚举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

题意:
定义ST新的匹配方式:

  • |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大的字符串是多少。

思路:
其实是个集合划分的字符串表示,方案总是数贝尔数。
那么考虑预处理一个dpf[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有多少种选择方式。

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

L. Digit sum

预处理即可。

posted @   Dup4  阅读(302)  评论(0编辑  收藏  举报
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
· 用 C# 插值字符串处理器写一个 sscanf
历史上的今天:
2018-09-16 The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online Solution
点击右上角即可分享
微信分享提示