ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BJOI 2019 题目选做

2022-01-20 21:33:29  阅读:167  来源: 互联网

标签:BJOI2019 奥术 le BJOI 神杖 玻璃 选做 2019 mathcal


之前做过的:[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. 正向光穿透的概率
  2. 正向光反射回来的概率
  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 树上父亲的权值之和!上一次出这个错将近是半年前了。

  代码

标签:BJOI2019,奥术,le,BJOI,神杖,玻璃,选做,2019,mathcal
来源: https://www.cnblogs.com/werner-yin/p/15828113.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有