Live2D

2020-08-11 题目题解

又来这边苟了一天,感觉可以听学长讲完再回归新初三那边吧,毕竟自己也不是新高二的。。。今天讲题的yhn学长果真是强者,可以在大考连续失误错失rank1,然后高考翻盘进北大。。。

Vasya and Big Integers

题目传送门

题目大意

给出一个大数 \(a,l,r\) ,求有多少种对 \(a\) 的划分方法使得划分出来的每一块都在 \([l,r]\) 之间。

\(a,l,r\le 10^{1000000}\)

思路

这道题我只能讲一下大概的思路,因为我自己并没有过掉,打了两个表才过掉,如果真的有人会看我这个小蒟蒻的博客的话,希望他能帮我看一下哪有问题。。。

我们不难想到设 \(f_i\) 表示划分到 \(i\) 的合法方案数,不难得到一个 \(\Theta(n^2)\) 的方法,即暴力转移用 \(\text{hash}\) 判断是否合法。

我们又发现,可以转移的点一定是连续的,于是我们可以移动左右端点,然后每次用 \(\text{hash}\) 判断两数大小。

时间复杂度 \(\Theta(n\log n)\),其中 \(n\)\(a\) 的位数,假设 \(l,r\) 的位数与 \(n\) 同阶。

虽然说起来很简单,但是有一些有关前导零的细节,还有一些奇奇怪怪的问题,所以实现起来很麻烦。。。

\(\texttt{Code}\)

代码戳这里打开

Recovering BST

题目传送门

题目大意

给出一个 \(n\) 的二叉树的中序遍历结果,求出是否存在一种方法使得该树一条边连接两点的点权 \(a_i\)\(\gcd\) 不为 \(1\)

\(n\le 700,a_i\le 10^9\)

思路

比较上一道实现起来比较简单。。。

不难想到一个dp方法,设 \(f_{l,r,0/1}\) 表示 \([l,r]\) 作为父节点的左/右区间的合法性,然后就可以做到 \(\Theta(n^3)\)

\(\texttt{Code}\)

代码戳这里打开

Helping People

题目传送门

题目大意

给出一个长度为 \(n\) 的序列,第 \(i\) 个点的初值为 \(a_i\) ,有 \(m\) 次操作,每次有 \(p_i\) 的概率将 \([l_i,r_i]\) 集体加 \(1\) ,问最后最大值的期望。

\(n\le 10^5,m\le 5000\),并且操作区间要么不相交要么完全包含。

思路

本来想用 \(\text{Min-Max}\) 容斥,但是看到 \(n\le 10^5\) 就放弃了。需要注意的是 :最大值的期望不等于期望的最大值 (这个学过期望的应该都明白吧?)

期望突破点就在于操作区间的关系,可以看出这个其实就是一个树形结构。然后我们就可以树形dp了,我们可以设 \(f_{u,i}\) 表示 \(u\) 这个区间最大值小于等于 \((i+\max_{j=l}^{r}a_j)\) 的概率,然后转移就很简单了,具体见代码。最后的答案也很好求,这里就不赘述了。

时间复杂度为 \(\Theta(m^2)\)

\(\texttt{Code}\)

代码戳这里打开

posted @ 2020-08-11 21:21  Dark_Romance  阅读(118)  评论(0编辑  收藏  举报