ZJOI2019做题笔记
麻将(期望、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做题笔记的更多相关文章
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- C语言程序设计做题笔记之C语言基础知识(上)
C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...
- SDOI2017 R1做题笔记
SDOI2017 R1做题笔记 梦想还是要有的,万一哪天就做完了呢? 也就是说现在还没做完. 哈哈哈我竟然做完了-2019.3.29 20:30
- SDOI2014 R1做题笔记
SDOI2014 R1做题笔记 经过很久很久的时间,shzr又做完了SDOI2014一轮的题目. 但是我不想写做题笔记(
- SDOI2016 R1做题笔记
SDOI2016 R1做题笔记 经过很久很久的时间,shzr终于做完了SDOI2016一轮的题目. 其实没想到竟然是2016年的题目先做完,因为14年的六个题很早就做了四个了,但是后两个有点开不动.. ...
- LCT做题笔记
最近几天打算认真复习LCT,毕竟以前只会板子.正好也可以学点新的用法,这里就用来写做题笔记吧.这个分类比较混乱,主要看感觉,不一定对: 维护森林的LCT 就是最普通,最一般那种的LCT啦.这类题目往往 ...
- java做题笔记
java做题笔记 1. 初始化过程是这样的: 1.首先,初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化: 2.然后,初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序 ...
- SAM 做题笔记(各种技巧,持续更新,SA)
SAM 感性瞎扯. 这里是 SAM 做题笔记. 本来是在一篇随笔里面,然后 Latex 太多加载不过来就分成了两篇. 标 * 的是推荐一做的题目. trick 是我总结的技巧. I. P3804 [模 ...
- PKUWC/SC 做题笔记
去年不知道干了些啥,什么省选/营题都没做. 现在赶应该还来得及(?) 「PKUWC2018」Minimax Done 2019.12.04 9:38:55 线段树合并船新玩法??? \(O(n^2)\ ...
随机推荐
- [四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式
前言简介 前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是 ...
- Spring Boot 2.x (十):构建优雅的RESTful接口
RESTful 相信在座的各位对于RESTful都是略有耳闻,那么RESTful到底是什么呢? REST(Representational State Transfer)表述性状态转移是一组架构约束条 ...
- 【Parallel】.Net 并行执行程序的使用心得
一.摘要 官方介绍:提供对并行循环和区域的支持. 命名空间:using System.Threading.Tasks 三个静态方法:Parallel.Invoke,Parallel.For,Paral ...
- string[]转list<long>,List转字符串
List转字符串,用逗号隔开 List<string> list = new List<string>();list.Add("a");list.Add(& ...
- JQuery autocomplete获得焦点触发弹出下拉框
需求:autocomplete控件,当点击获得焦点的时候也要弹出下拉列表(autocomplete默认是输入之后才会跟随出下拉列表),下面直接贴代码. js代码: $("#customerN ...
- JS 事件绑定,监听,委托(代理)
我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等.这些名词是什么意思呢,有什么作用呢? 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元 ...
- 【Dojo 1.x】笔记目录
学习笔记和教程是不同的,笔记是随心记,学到什么就写什么,我尽量按逻辑顺序写笔记. Dojo是什么? Dojo是这么一个JavaScript框架,区别于jQuery等小型类库,这个类库更合适于构建Web ...
- nginx在代理转发地图瓦片数据中的应用
最近有这样一个需求,需要将arcgis server发布的地图瓦片放在移动硬盘中,系统演示的时候,直接调用本地的地图瓦片,而非远程的,主要是为了系统演示的时候加快地图访问速度. 而且需要在任意电脑运行 ...
- Linux中Apache服务器的简单配置
配置Apache服务器: 1.安装Apache,可以参考Linux 中yum的配置来安装: yum install http* -y 2.修改SELinux: setenforce 0 查看: 3.防 ...
- windows10禁用更新方法
本方法由本人在无意中发现,实测有效 1.第一步 打开文件管理器路径进入到win10的下载更新文件的目录 C:\Windows\SoftwareDistribution 选中Download文件夹 ...