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)\ ...
随机推荐
- 【API知识】一种你可能没见过的Controller形式
前言 这里分享一下我遇到的一个挺有意思的Controller形式,内容涉及@RequestMapping注解的原理. 实际案例 一.基本描述 项目甲中有多个模块,其中就有模块A和B.(这里的模块指的是 ...
- REST API设计指导——译自Microsoft REST API Guidelines(二)
由于文章内容较长,只能拆开发布.翻译的不对之处,请多多指教. 另外:最近团队在做一些技术何架构的研究,视频教程只能争取周末多录制一点,同时预计在下周我们会展开一次直播活动,内容围绕容器技术这块. 所有 ...
- [二十五]JavaIO之RandomAccessFile
功能简介 我们之前一直说流顺序的,不能随机访问,的确之前说的IO体系的确如此 但是 RandomAccessFile自成一派 此类的实例支持对随机访问文件的读取和写入 我们之前介绍过DataOutpu ...
- -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流
File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...
- 只需要4步就可以将asp.net mvc变成SPA(单页面)应用,实现无刷新页面切换!
SENNA.js Senna.js是一个超快速的单页面应用程序引擎,轻松构建基于Web的现代应用程序,只有大约8KB的JavaScript而没有任何依赖性.还提供非常酷炫的动画效果.想要详细了解的朋友 ...
- kill -3 PID命令获取java应用堆栈信息
一.应用场景: 当linux服务器出现异常情况(响应缓慢,负载持续飙升)并且服务器没有安装对应的包而无法使用jstack等命令时,可以使用linux的kill相关命令打印堆栈信息. 命令格式:kill ...
- [日常] nginx记录post数据
1.使用log_format指令来更改日志格式,该指令只能放在http{}段 log_format 日志名 '日志内容'; server { access_log /var/log/nginx/d ...
- 用php输出心形曲线
<?php for($t=0;$t<360;$t++) { $y=2*cos($t)-cos(2*$t); //笛卡尔心形曲线函数 $x=2*sin($t)-sin(2*$t); $x+= ...
- HTML和CSS在IE7中常见的兼容性问题
IE7及以下版本都会有这些问题 1.IE7块转内联块问题 问题描述:好像块转内联块失败,依然不在一行排列 解决办法:给元素添加如下css *display:inline;*zoom:1; *di ...
- 前端入门12-JavaScript语法之函数
声明 本系列文章内容全部梳理自以下几个来源: <JavaScript权威指南> MDN web docs Github:smyhvae/web Github:goddyZhao/Trans ...