BJOI 2019 题目选做
之前做过的:[BJOI2019] 排兵布阵、[BJOI2019]删数 就懒得更了
[BJOI2019]勘破神机 已经弃疗了。
[BJOI2019]送别 还在咕咕咕咕。
Luogu5323 [BJOI2019]光线
当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收。
设对于任意 \(x\),有 \(x \times a_i\%\) 单位的光会穿过它,有 \(x \times b_i\%\) 的会被反射回去。
现在 \(n\) 层玻璃叠在一起,有 \(1\) 单位的光打到第 \(1\) 层玻璃上,那么有多少单位的光能穿过所有 \(n\) 层玻璃呢?
\(n\le 5\times 10^5\),\(1\le a_i \le 100\),\(0\le b_i \le 99\),\(1\le a_i+b_i \le 100\)
递推
动态规划
开始的想法:设 \(f_i, g_i\) 表示正着照和反着照到 \(i\) 号玻璃的光的量,然后会列出一堆方程,可以直接使用高斯消元解出,复杂度 \(\mathcal O(n^3)\),根据矩阵的特殊性质(只有每行只有几个地方有值),应该可以优化到 \(\mathcal O(n^2)\)。口胡,没写代码
但是稍微考虑,可以得到一个更加简单的写法:
- 如果只有两个玻璃,那么 \(f_i, g_i\) 可以轻易地求出。
- 但是有 \(3\) 个玻璃呢?
- 可以先把前面两个玻璃合并,然后转化成两个玻璃了!
于是,可以考虑每次合并玻璃,但是这个玻璃和原来的玻璃有所不同(因为正面穿透和反面穿透不同),于是我们要维护 \(4\) 个值:
- 正向光穿透的概率
- 正向光反射回来的概率
- 反向光穿透的概率
- 反向光反射回来的概率
原来的玻璃 \(1 = 4, 2 = 3\),而合并两块玻璃的时候,可以讨论是第几次出来的,就会得到一个等比数列求和的形式,可以快速计算。
Luogu5319 [BJOI2019]奥术神杖
你作为神术一脉第五百零一位传人,接受了这个艰巨而神圣的使命。
神杖上从左到右镶嵌了 \(n\) 颗奥术宝石,奥术宝石一共有 \(10\) 种,用数字 0123456789 表示。有些位置的宝石已经残缺,用 . 表示,你需要用完好的奥术宝石填补每一处残缺的部分(每种奥术宝石个数不限,且不能够更换未残缺的宝石)。古老的魔法书上记载了 \(m\) 种咒语 \((S_i,V_i)\) ,其中 \(S_i\) 是一个非空数字串,\(V_i\) 是这种组合能够激发的神力。神杖的初始神力值 \(Magic = 1\),每当神杖中出现了连续一段宝石与 \(S_i\) 相等时,神力值 \(Magic\) 就会乘以 \(V_i\)。设 \(c\) 为神杖包含的咒语个数(若咒语类别相同但出现位置不同视为多次),神杖最终的神力值为 $ \sqrt[c]{Magic}$。
输出任何一个解即可。
\(n, \sum_{|S_i|}, m \le 1501\)
字符串
AC 自动机
动态规划
二分
常用套路,对于乘积的形式,我们可以先将所有数取 \(\ln\),然后每次就是相加了,最后的答案就是 \(e\) 的次幂的形式了。
现在有开根,就是将最后的答案除以 \(c\),于是我们可以有如下解法:
- 建立 AC 自动机,每个节点维护值的 \(\ln\) 之和以及次数。
- 考虑 dp,维护 \(f(i, j,k)\) 表示对于前 \(i\) 个字符,目前在 AC 自动机 \(j\) 号节点,出现次数之和是 \(k\)。
于是有 \(\mathcal O(n^4)\) 的解法了!(\(k\) 的上界好像是 \(\mathcal O(n^2)\) 的)
考虑优化,仍然是经典套路,最后的答案就是所有出现的值的平均值,于是我们可以二分这个平均值,于是可以消去 \(k\) 这一维状态,复杂度 \(\mathcal O(n^2\log V)\)。
总的来说,这个题想得还是比较顺利的,就是套路大杂烩,但是又犯了一些 SB 错误:
- AC 自动机的节点的权值应该是其 Fail 树上父亲的权值之和!上一次出这个错将近是半年前了。