题目描述

有一个 \(n\) 行无穷列的海域,每个格子有 \(q\) 的概率安全, \(1-q\) 的概率不安全。从中框出一个面积最大的矩形,满足以下两个条件:

(1)矩形内的格子均安全;

(2)矩形必须紧靠海域的最左端(即包含第一列的格子)。

问最大面积为 \(k\) 的概率是多少。这里在模998244353意义下计算,给出 \(q\) 的分数表示形式 \(q=x/y\) 。

数据规模: \(1 \le n \le 10^9, 1 \le k \le 5 \times 10^4\) 。

简要题解

该问题等价于不超过 \(k\) 的概率减去不超过 \(k-1\) 的概率。

设 \(dp[i][j]\) 表示海域有 \(i\) 行,且第1列到第 \(j\) 列全安全的条件下,选取的最大面积不超过 \(k\) 的概率。我们要求的即为 \(dp[n][0]\) 。

初始条件和边界条件如下: \(dp[i][j]=0,i \times j>k,dp[0][j]=1\)

考虑 \(dp[i][j]\) 从谁转移。有两种情况:

情况一:第 \(j+1\) 列全安全;

情况二:第 \(j+1\) 列存在不安全的格子,则可以枚举第 \(j+1\) 列最靠上的不安全位置 \(t\) ,那么当且仅当上面 \(t-1\) 行面积不超过 \(k\) (概率 \(dp[t - 1][j + 1]{q^{t - 1}}\) ),且下面 \(i-t\) 行面积不超过 \(k\) (概率 \(dp[i-t][j]\) )时,整个地图选取的最大面积才不超过 \(k\) 。因而转移方程:

\[dp[i][j] = dp[i][j + 1]{q^i} + \sum\limits_{t = 1}^i {dp[t - 1][j + 1]{q^{t - 1}}(1 - q)dp[i - t][j]} \]

对于dp的复杂度,当 \(j=0\) 时暂时只求出 \(i \le k\) 的项, \(j>0\) 时只需求 \(ij \le k\) 的项,写成求和式为

\[\Theta ({k^2}) + \sum\limits_{j = 1}^k {\sum\limits_{i = 0}^{k/j} i } = \Theta({k^2})\]

考虑进一步优化。注意到转移是一个和自身相关的卷积,因而考虑生成函数。

设 \(F_j(x)\) 是 \(dp[i][j]\) 的生成函数, \(G_j(x)\) 是 \(dp[i][j]{q^i}\) 的生成函数,则\[{F_j}(x) = {G_{j + 1}}(x) + (1 - q)x{G_{j + 1}}(x){F_j}(x)\]得\[{F_j}(x) = \frac{{{G_{j + 1}}(x)}}{{1 - (1 - q)x{G_{j + 1}}(x)}}\]

按 \(j\) 递减顺序交替求 \({F_j}(x),{G_j}(x)\) ,时间复杂度为

\[\sum\limits_{j = 1}^k {\left\lfloor {\frac{k}{j}} \right\rfloor \log \left\lfloor {\frac{k}{j}} \right\rfloor } \approx k\sum\limits_{j = 1}^k {\frac{{\log k - \log j}}{j}} \approx k\log k\ln k - \frac{1}{2}k\log k\ln k = \Theta (k{\log ^2}k)\]

接下来考虑 \(dp[i][0](i>k)\) 。原始状态转移方程可化简为 \[dp[i][0] = \sum\limits_{t = 1}^{k + 1} {dp[t - 1][1]{q^{t - 1}}(1 - q)dp[i - t][0]}\] 不难发现是常系数齐次线性递推。因而可在 \(k \log k \log n\) 时间复杂度解决。

总时间复杂度 \(k \log k(\log k+\log n)\) 。

核心代码

已略去冗长的多项式模板以及线性递推模板。

 int q, qi[];
int solve(int n, int k)
{
Poly f(, ), g(, ), a;
for (int j = k; j >= ; j--){
int d = j ? k / j : k;
if (j == )a = g * (q - );
f.resize(d + ); g.resize(d + );
for (int i = ; i <= d; i++)
f[i] = mul(g[i - ], q - );
f = g * inv(f);
for (int i = ; i <= d; i++)
g[i] = mul(f[i], qi[i]);
}
reverse(a.begin(), a.end());
a.push_back();
return linear_recursion(a, f, n);
}
int main()
{
int n, k, x, y;
scanf("%d%d%d%d", &n, &k, &x, &y);
q = mul(x, power(y, MOD - ));
qi[] = ;
for (int i = ; i <= k; i++)
qi[i] = mul(qi[i - ], q);
printf("%d", sub(solve(n, k), solve(n, k - )));
}

总结

非常喜欢这类蕴含着思维难度,但是代码量极少的题目。真心佩服出题人系列~

参考博客

http://blog.csdn.net/ez_yww/article/details/78679459

BZOJ4944 泳池 解题报告的更多相关文章

  1. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  2. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  3. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  4. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  5. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  6. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  7. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

  8. NOIP2016提高组解题报告

    NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合

  9. LeetCode 解题报告索引

    最近在准备找工作的算法题,刷刷LeetCode,以下是我的解题报告索引,每一题几乎都有详细的说明,供各位码农参考.根据我自己做的进度持续更新中......                        ...

随机推荐

  1. 如何安装Pycharm官方统计代码行插件

    最近一直想统计Pycharm的总计代码行数,找到了官方的统计行数插件,发现效果还不错. 官方代码统计插件指导: https://plugins.jetbrains.com/plugin/4509-st ...

  2. js获取Session的值

    纯htm页面必须采用AJAX了, ASP页面:var manager='<%=session("manager")%>', ASPX页面:var manager='&l ...

  3. 我的sql数据库存储过程分页- -

    以前用到数据库存储过程分页的时候都是用 not in 但是最近工作的时候,随着数据库记录的不断增大,发现not in的效率 真的不行 虽然都设置了索引,但是当记录达到10w的时候就发现不行了,都是需要 ...

  4. tomcat 工作原理

    Tomcat原理 分类: TOMCAT2009-05-17 22:25 4366人阅读 评论(3) 收藏 举报 tomcatexceptionsocketstringservernull Tomcat ...

  5. 多台或者集群环境下如何保证spring定时器只执行一个

    先说一下我们的系统, 在65和66上分别部署有weblogic节点,共计四个,在项目中我们的定时器会隔一段时间就从其它的五个系统中取数据,这时就出现了问题,本来取一次数据就可以的,现在重复执行了三次, ...

  6. Zabbix如何设置脚本告警

    设置告警脚本的路径 # vim /etc/zabbix/zabbix_server.confAlertScriptsPath=/usr/lib/zabbix/alertscripts 创建脚本 在这里 ...

  7. Day15 jss整体结构梳理

    JS DOM--- 两个步骤: 1 查找标签 (1)直接查找 document.getElementById("idname") // dom对象 document.getElem ...

  8. quicksort(java版)

    相信大家都知道几种排序算法,比如说冒泡排序,选择排序,插入排序等等,这些个算法都不是很难,自己多多理解理解就能掌握了,而今天我们要谈的就是重头戏就是快速排序. 引用大牛的思想来对排序算法解释一下.(文 ...

  9. 人手一份核武器 - Hacking Team 泄露(开源)资料导览手册

    https://zhuanlan.zhihu.com/p/20102713 author:蒸米 0x00 序 事先声明本人并不是全栈安全工程师,仅仅是移动安全小菜一枚,所以对泄漏资料的分析难免会有疏忽 ...

  10. 清理out的浏览器收藏夹发现的

    刚才清理了一下自己的浏览器书签,其实好几年不做收藏了,常用的直接放到书签栏里就行了. 发现不少之前的技术内容域名都被色情病毒经营者续费利用,相关技术内容都是VB.SQL.XMAPP这些过期的玩意,其中 ...