麻将(期望、DP套DP)

先考虑如何计算一个子集是否能胡。

设\(f_{i,0/1,j,k}\)表示考虑了子集中\(1 \sim i\)的牌,是否找到对子,\(i-1,i,i+1\)预计拿\(j\)个,\(i,i+1,i+2\)预计拿\(k\)个,最多能够产生多少面子。注意到\(j\)和\(k\)的状态都是预计,所以并不算入面子数。转移枚举有多少个\(i+1\)、预计拿多少个\(i+1,i+2,i+3\)的顺子,剩下的全部拿刻子。至于为什么考虑\(i+1,i+2,i+3\)而不是\(i-1,i,i+1\)是因为这样边界比较好算。

然后考虑原问题。发现原问题相当于:对于手中摸了\(i(i \geq 13)\)张牌,考虑这些牌有没有胡的子集,如果没有贡献+1,然后再摸一张。所以我们只需要计算满足摸了\(i\)张还没有胡的子集的方案数,然后乘上\((4n-i)!\)加起来就是所有排列的权值总和。

后面的问题仍然可以从小到大枚举牌来DP。考虑将上面\(f\)的状态压进当前DP状态里,设\(g_{i,j,k}\)表示考虑了前\(i\)种牌,共拿了\(j\)张牌,\(f\)数组的状态为\(k\)时的方案数,转移枚举\(i+1\)选了多少个,转移一下\(k\)即可。

最后的问题是\(k\)的状态量,暴搜可以搜出本质不同的不胡状态总共有\(2091\)种,所以复杂度为\(O(2091n^2)\)可以通过。

代码

线段树(期望、线段树、矩阵)

原题可以等价转化为:一棵线段树有\(0.5\)的几率打一个标记,有\(0.5\)的几率不打,问标记个数期望。

设\(f_{i,0/1/2}\)表示第\(i\)个点,它和它的祖先都不存在标记/它的祖先存在标记,它不存在标记/它存在标记的期望。转移分:经过的点、pushdown到达的点、打上标记的点、祖先打上标记的点四种情况分别乘上一个矩阵转移,最后的答案就是所有的\(f_{i,2}\)的和。

可能需要一定的常数优化。可以发现\(f_0+f_1+f_2 = 1\),所以可以压掉一个变成\(2 \times 2\)。

代码

Minimax搜索(动态DP)

对于一个已知的集合\(S\),如果通过\(w(S)\)将根节点权值变为\(W+x\),那也一定可以变为\(W+1\);能够变为\(W-x\),也一定能够变为\(W-1\)。所以我们只需要考虑将根节点变为\(W \pm 1\)的能量消耗。

首先,如果集合中存在\(W\)号点,那么它的权值一定为\(1\),因为只需把\(W\)修改成\(W \pm 1\)就可以改变根节点的值。所以若设\(ans_i\)表示\(k \leq i\)的答案的和,那么\(ans_1 = 2^{m-1}\),由题意可知\(ans_n = 2^m - 1\)。对于接下来考虑的所有集合,均认为它们不包含\(W\)号点。

我们枚举一个\(k \in [L,R]\)考虑计算\(ans_k\)。对于一个集合\(S\),如果想让根节点权值变为\(W+1\),那么编号\(\geq W+1\)的点的权值不需要变化,而\(<W\)的点的权值在改变量不超过\(k\)的情况下变为\(W+1\)一定是最优的;而变为\(W-1\),则只让\(>W\)的点在改变量不超过\(k\)的情况下把权值变为\(W-1\)。那么也就是说:一个集合中让根节点权值变为\(W+1\)需要修改的点和让根节点权值变为\(W-1\)需要修改的点是独立的,所以不满足条件的方案数就是:选择一些\(<W\)的点,将它们修改为\(W+1\)之后根节点权值不变;选择一些\(>W\)的点,将它们修改为\(W-1\)之后根节点权值不变,这两种方案的乘积。

那么可以设计一个\(dp\):设\(f_i\)表示仅改变编号\(<W\)的点的权值,点\(i\)的权值\(\leq W\)的概率。至于为什么是概率,因为后面好算。又设\(g_i\)表示仅改变编号\(>W\)的点的权值,点\(i\)的权值\(<W\)的概率。这两种dp的转移都是一样的,如果\(2 \not\mid dep_u\)则\(f_u = \prod f_v\),否则是\(f_u = 1 - \prod (1 - f_v)\),其中\(v\)是\(u\)的儿子。

那么\(ans_k = 2^{m-1} + 2^{m-1}(1 - f_1(1 - g_1))\)。对于每一个\(k \in [L-1,R]\)算一下答案,就有一个70pts的DP。

然后可以发现:当\(k\)从\(i\)变到\(i+1\)的时候,至多有一个叶子会在\(f\)中改变值,至多有一个叶子在\(g\)中改变值,所以动态DP。

具体的,令\(f'_v = [2 \not\mid dep_v]f_v + [2 \mid dep_v](1 - f_v)\),那么\(f'\)的转移就变成了统一的\(f'_u = \prod (1 - f'_v)\)。然后设\(x^i\)表示树链剖分后\(x\)所在重链深度为\(dep_x + i\)的点,那么一段重链的转移可以写成\(f_{top} = \sum\limits_{i=0}^{dep} (-1)^i \prod\limits_{j=0}^i ldp_{top^j}\),其中\(ldp\)表示的是轻边传上来的答案,至于怎么推直接暴力拆式子。这个式子的值可以通过每条重链维护一棵线段树求。

最后动态DP撤销贡献的时候有可能会除\(0\),所以对于每一个数记一下非\(0\)的数的乘积和乘\(0\)次数,就可以做到除法。

代码

ZJOI2019做题笔记的更多相关文章

  1. C语言程序设计做题笔记之C语言基础知识(下)

    C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...

  2. C语言程序设计做题笔记之C语言基础知识(上)

    C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...

  3. SDOI2017 R1做题笔记

    SDOI2017 R1做题笔记 梦想还是要有的,万一哪天就做完了呢? 也就是说现在还没做完. 哈哈哈我竟然做完了-2019.3.29 20:30

  4. SDOI2014 R1做题笔记

    SDOI2014 R1做题笔记 经过很久很久的时间,shzr又做完了SDOI2014一轮的题目. 但是我不想写做题笔记(

  5. SDOI2016 R1做题笔记

    SDOI2016 R1做题笔记 经过很久很久的时间,shzr终于做完了SDOI2016一轮的题目. 其实没想到竟然是2016年的题目先做完,因为14年的六个题很早就做了四个了,但是后两个有点开不动.. ...

  6. LCT做题笔记

    最近几天打算认真复习LCT,毕竟以前只会板子.正好也可以学点新的用法,这里就用来写做题笔记吧.这个分类比较混乱,主要看感觉,不一定对: 维护森林的LCT 就是最普通,最一般那种的LCT啦.这类题目往往 ...

  7. java做题笔记

    java做题笔记 1. 初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序 ...

  8. SAM 做题笔记(各种技巧,持续更新,SA)

    SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...

  9. PKUWC/SC 做题笔记

    去年不知道干了些啥,什么省选/营题都没做. 现在赶应该还来得及(?) 「PKUWC2018」Minimax Done 2019.12.04 9:38:55 线段树合并船新玩法??? \(O(n^2)\ ...

随机推荐

  1. Pycharm远程调试原理及配置

    工作中使用Pycharm作为python开发的IDE,作为专业的python集成开发环境,其功能之强大令人折服.开发过程中Debug是必不可少的.平时经常使用Pycharm的remote debug功 ...

  2. 【憩园】C#并发编程之概述

    写在前面 并发编程一直都存在,只不过过去的很长时间里,比较难以实现,随着互联网的发展,人口红利的释放,更加友好的支持并发编程已经成了主流编程语言的标配,而对于软件开发人员来说,没有玩过并发编程都会有点 ...

  3. #5 Python面向对象(四)

    前言 本节将是Python面向对象的最后一篇博文了,这节将记录类的特殊方法.特殊成员方法.旧类和新类的不同,以及一些其他知识.Go! 一.类的特殊方法 Python有三种特殊方法:实例方法.静态方法. ...

  4. JS输入框去除负号(限定输入正数)

    onkeyup="(this.v=function(){this.value=this.value.replace(/\-/g,\'\');}).call(this)" 示例: & ...

  5. [日常] 解决mysql不允许外部访问

    1.在端口已经开放的情况下,ubuntu mysql 3306允许远程访问vim /etc/mysql/mysql.conf.d/mysqld.cnf注释#bind-address = 127.0.0 ...

  6. 4-4 Redis 的常用配置

    2016-12-22 15:30:43 本篇文章属于Redis 系列第四篇文章:Redis 配置文件介绍 该系列文章链接 NoSQL 数据库简介 Redis的安装及及一些杂项基础知识 Redis 的常 ...

  7. vue2.x 给一个对象里添加一个没有的属性

    obj = {...obj, name:'addName'} //给obj对象 添加一个name字段,并且赋值为‘addName’ 参考:

  8. idea使用事项

    1.调用外部jar包 Run/Debug Configurations --- Tomcat Server --- Startup/connection --- Debug 添加“path”变量:** ...

  9. ios屏幕怎么投屏到电脑显示器

    iphone在国内一直都很受欢迎,为什么这么受欢迎呢?其实苹果手机操作系统非常的新颖,让人对手机有了重新的认识.但是ios屏幕怎么投屏到电脑显示器.感兴趣的一起阅读下面的内容吧! 使用工具: 苹果手机 ...

  10. JS的MD5加密

    /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as d ...