dp记录
那就是希望。
即便需要取模,也是光明。
感觉自己 dp 不行,打算先专门练一阵子 dp。
以下是从国庆开始的训练实录。
会根据我自己水平定个难度。
- \(\rm Easy\):独立想出并用时短。
- \(\rm Middle\):独立想出并用时长。
- \(\rm Hard\):看了题解,理解用时短。
- \(\rm VeryHard\):看了题解,理解用时长。
20221001
- NOI2016 国王饮水记(\(\rm VeryHard\))
牛逼的找结论 dp 题。
20221005
- AGC013D Piling Up(\(\rm Middle\))
有意思的格路计数。不过直接 dp 即可通过。
20221006
- CF868F Yet Another Minimization Problem(\(\rm Easy\))
有趣的决策单调性优化 dp,要莫队计算贡献。
20221008
- TJOI2019 甲苯先生的线段树(\(\rm VeryHard\))
有一车天上掉下来的结论的数位 dp。
对结论的口胡证明放在本地。 - THUPC2021 混乱邪恶(\(\rm Hard\))
神秘的背包 dp,要随机顺序转移来优化状态,这个结论好神秘哇……
20221009
- CF1392H ZS Shuffles Cards(\(\rm Middle\))
推柿子的 dp。
My Solution。
20221010
- HNOI2008 Cards(\(\rm Easy\))
Burnside 引理,再加上简单背包计算即可。 - SDOI2009 学校食堂(\(\rm Easy\))
简单状压。细节有点多。 - SHOI2009 舞会(\(\rm Hard\))
为啥要出高精度。
打了个 \(O(n^4)\) 的暴力(算上高精度用时)过了,看了看耗时发现不对劲。(好吧其实我是加了一车剪枝的压位高精)
好家伙,为啥这题 \(O(n^4)\) 都能草啊。
看了题解才发现正解是 \(O(n^3)\) 的。
这种双射技巧好牛逼啊。不过蛮好理解的。
然后不看题解自己推,推了巨久还推挂几次,最后画了个图才解决。
然后通过压位高精跑到了最优解。 - USACO15JAN Moovie Mooving G(\(\rm Easy\))
小丑表示自己没看到是从 \(0\) 开始的 \(L\) 分钟,而以为是任意的 \(L\) 分钟,感觉很不可做……
如果这样的话,这不就是憨憨状压了吗。
绷不住了。
最优子结构显然成立。
20221011
- SDOI2012 基站建设(\(\rm Easy\))
计算几何是吧。
虽然这题计算几何的部分不多而且涉及关键,但还是很令人无语……
设发射点坐标 \(x_1\),发射半径 \(r_1\);接收点坐标 \(x_2\),接受半径 \(r_2\)。
考虑 \((x_2-x_1)^2+(r_2-r_1)^2=(r_1+r_2)^2\),
于是 \((x_2-x_1)^2=4r_1r_2\),
从而 \(\sqrt{r_2}=\dfrac{x_2-x_1}{2\sqrt{r_1}}=\dfrac{x_2}{2\sqrt{r_1}}-\dfrac{x_1}{2\sqrt{r_1}}\),
于是转移方程 \(f_i=\min\{\dfrac{x_i}{2\sqrt{r_j}}+(f_j-\dfrac{x_j}{2\sqrt{r_j}})|j<i\}+v_i\)。
妥妥的斜率优化,直接做就好了。
不幸由于没有满足区间包含单调性与四边形不等式,决策单调性并不满足。
然后转移还是半在线的,得 cdq 分治/二进制分组。
loj 上被卡常了。这么开小时限强迫人写平衡树/李超树不好吧。
卡常卡过去了。 - SDOI2011 拦截导弹(\(\rm Easy\))
搁着强行考 cdq 分治是吧……
思维难度不大,写起来很丑。
而且这题命题也不严谨。完全可能会爆精。 - SCOI2008 奖励关(\(\rm Easy\))
简单状压,逆推即可。 - ZJOI2012 波浪(\(\rm Hard\))
这个拆贡献按 \(n\) 递增序枚举想的到,但没有想到这么设 dp 状态。
设完后就不难了。
申必数据分治还是差不多得了,为啥不考模意义。 - HAOI2011 Problem c(\(\rm Easy\))
容易想起 ZJOI 里一道叫做看电影的题目。
然而这里的做法不能照搬,因为那道题目的公式有特殊性质。
考虑几个显然的结论:
编号顺序对答案没有影响;可行的充要条件是 \(\forall k\in[1,n]\),\(a_i\) 达到 \(k\) 的元素个数不超过 \(n-k+1\) 个。
于是,直接画出一张 Young 表,第 \(k\) 行有 \(n-k+1\) 个格子,要求每一行前若干个格子填 \(1\),后若干个格子填 \(0\),
使得第一行填满 \(1\),每一行还要比后一行多出选 \(a_i\) 为 \(k\) 的人的个数个格子。
于是直接 dp,然后同时在 dp 时分配标号即可。
注意判断无解的情况。
诶复杂度是不是假的。
蛤,结果直接过了,瞄了眼题解,正解就是这个……
手动测了极限数据,跑得飞快,不开 O2 也只用 \(1{\rm s}\) 左右。 - CF1009F Dominant Indices(\(\rm Easy\))
学了一下长剖优化 dp,重新写了一遍这题。
20221012
- POI2014 HOT-Hotels(\(\rm Easy\))
有趣(但套路?)的长剖优化 dp。(连着加强版一起过了)
感觉很不错。 - 清华集训2012 串珠子(\(\rm Easy\))
简单的集合幂级数操作。
20221013
- SHOI2006 仙人掌(\(\rm Easy\))
憨憨题。 - CQOI2017 老C的键盘(\(\rm Easy\))
憨憨题。和 SAO 本质一致。 - NOI2012 迷失游乐园(\(\rm Middle\))
憨憨题。想起来很简单,只是很容易写挂。
bonus:可以做到严格线性,不依赖环长。但是代码鸽了。
简单来说,就是把环上部分并行处理,然后必要时再剔除某部分贡献。 - NOI2013 书法家(\(\rm Middle\))
憨憨题。想起来很简单,只是很容易写挂。
绝世傻逼题属于是了。
My Solution。
20221014
- APIO2015 巴厘岛的雕塑(\(\rm Hard\))
只能想到 \(O({n^3\log v\over w})\) 的做法,大寄。
试试。不出所料地被卡了。
看了题解。
草,没看到特殊性质,数据分治是吧。
那不就憨逼题了。 - ZJOI2019 麻将(\(\rm VeryHard\))
感觉非常困难。
瞄了眼题解,除了第一步转化外看不懂在说哈,于是开始自己推。
大概就是先建出一个自动机,然后每读入一个 \(0\sim4\) 的数据走一步,最后要使得终状态表示为胡牌。
考虑怎么建。
我们同时考虑七对子和一对子四面子的胡法,我们把这个东西分开考虑,然后分别作为二维坐标,做笛卡尔积(张量积)即得当前状态。
对于第一类转移,直接记录当前有几个牌满两张了,满七对子就记为七对子,状态数仅为 \(8\)。
对于第二类转移,考虑从末尾两项中分别取 \(a+b,b\) 张以备后用,然后记录对于每个确定的 \(a,b\),剩下的部分在不要求有对子时最多几个面子,在要求有对子时最多几个面子,显然有 \(36\) 种情况,枚举 \(a,b\) 取笛卡尔积即得 \(36^{15}\) 种状态,直接爆炸。
考虑压缩状态数。
首先如果你要求对子时面子数已经达到 \(k\),则 \(a+b>4-k\) 没有意义,直接不记录这一维即可;或者说,强制把 \(k\) 改为 \(4-a-b\)。
然后从起点 bfs 出可达状态,发现实际可达状态总量很少。
然后直接建自动机就好了。结果得到的状态数比正解还更优?只有 \(1741\) 个。
接下来就是考虑怎么 dp 了。
我们的目的是求出跑路下去的期望长度。
这个……感觉好像不方便处理啊。
咋办呢。
考虑直接计算每步的不合法方案数。
然后直接 dp 就好了。 - APIO2010 特别行动队(\(\rm Easy\))
斜率优化容易推导,决策单调性可以证明。
懒了,直接决策单调性优化了。
维护单调队列,决定决策点覆盖区间。
20221015
- SCOI2010 股票交易(\(\rm Easy\))
憨憨的单调队列。
20221016
- 十二省联考2019 希望(\(\rm VeryHard\))
写挂了,摆烂。 - SDOI2016 储能表(\(\rm Easy\))
异或卷积套路题。 - JSOI2016 位运算(\(\rm Easy\))
暴力异或卷积乱杀。
但是 loj 上被卡空间了。
20221017
- PKUWC2018 Minimax(\(\rm Easy\))
简单的线段树合并。
首先注意到 \(iV_i\) 是假的,直接乘起来就好了。
然后发现 \(D_i^2\) 的贡献不方便处理。
于是只能考虑暴力计算出对每个权值,其在根节点上对应的概率。
考虑怎么做。
首先如果一个点只有一个儿子,它显然可以丢掉。
于是每个节点要么是叶子,要么有两个儿子。
如果有两个儿子,考虑线段树合并。
强力维护出每种权值的概率,线段树打上乘法标记就完了。
离散化然后写吧。简单一点。 - 清华集训2017 简单数据结构(\(\rm Hard\))
以下 \(n\leftarrow N,v\leftarrow M,q\leftarrow Q\)。
注意到其互不相同。
因此此时为倍数则至少翻 \(2\) 倍。
于是答案 \(1\) 不会超过 \(\log_2v\)。
考虑怎么办。
考虑利用题目性质。
注意到更改一个点后,答案可能发生更新的只有它的因倍数。
暴力找到这些位置,更新其答案。
容易发现每次更新的点数总量总为 \(O(Cv\log v)\) 级别的,且显然跑不满。
接下来考虑如何快速更新答案。
容易发现,记录一个节点最长作为怎么一个序列的开始是有利的。
这样就不用枚举倍数了,只用枚举因数,而因数可以预处理出来;并且这样子也方便更新答案。
于是关键在于快速查询因子的对应答案。
怎么办?
每个点上维护一个堆?
这样子显然不优。
我们考虑直接从修改操作的性质出发。
如果是在开头修改,直接用当前点答案更改全局答案即可;计算当前答案可以直接枚举倍数。
如果是在末尾修改,我们考虑使用一些奇技淫巧。
从大到小枚举因子,计算答案时肯定不会缺数据。
维护每个点向右答案为 \(w\in[1,\log_2v]\) 的点的答案个数,然后每次修改只用改变其在 \(x\) 因子中对应倍数的点的位置,答案改变量是 \(O(1)\) 的,直接改变答案指针即可。
如果暴力枚举关系对是 \(O(\tau^2(x))\) 的,无法接受。
这个东西虽然常数小跑不满但显然过不去……
于是考虑怎么优化。
注意到如果 \(a_i|a_j,a_j|a_k,i<j<k\),则显然拿 \(j\) 更新 \(i\) 而不是拿 \(k\) 更新 \(i\) 更优,也即不用记录 \(k\) 对 \(i\) 的贡献。
因此记录每个点 \(j\) 需要更新哪些 \(i\),暴力 bfs 即可。
如果一个点答案没有变,它也不需往回入队,直接停了就好了。
直觉上这个东西感觉跑不满。
...
这个东西在 luogu/loj 跑得飞快,但在 uoj 上挂了。
摆了,看题解去了。
草,好像我的做法理论优于正解但实际效率太逊了。
唔,是不是也不是更优啊。
但是差不多,思路类似,而且似乎暴力枚举关系对是正确的复杂度…… - SDOI2017 切树游戏(\(\rm Easy\))
简单且套路的动态 dp。
我们先套路的 FWT 一下。
这样我们只用求出 \(m\) 个对应点的答案。
设 \(f_p\) 表示以当前点为根的联通子树的权值之和。
设 \(g_p\) 表示以当前点为根的子树中的联通子树的权值之和。
则 \(f_p=v_p\prod_s(1+f_s),g_p=f_p+\sum_sg_s\)。
设 \(h_p=v_p\prod_{\text{轻儿子}s}(1+f_s),u_p=\sum_{\text{轻儿子}s}g_s\)。
则 \(f_p=(1+f_{\text{重儿子}s})h_p,g_p=f_p+u_p+g_{\text{重儿子}s}\)。
于是写成矩阵形式。
\(\begin{bmatrix}f_p\\g_p\\1\end{bmatrix}=\begin{bmatrix}h_p&&h_p\\h_p&1&h_p+u_p\\&&1\end{bmatrix}\begin{bmatrix}f_{\text{重儿子}s}\\g_{\text{重儿子}s}\\1\end{bmatrix}\)
直接上全局平衡二叉树维护就好了。
值得注意的是,在链顶轻儿子信息传递时,\(f_p\) 的维护不能直接乘除,否则可能除零。正确的做法是维护有几个零,以及其余数的乘积。 - NOIP2018 保卫王国(\(\rm Easy\))
填坑。
用 gbt 把 uoj 版本过了,不必多说。
但是常数不是一般的大,跑得还没有别人 lct 的快……
20221018
- CF573D Bear and Cavalry(\(\rm Hard\))
高质量结论题。
摆结论:按 \(w,h\) 升序排序,则总有最优匹配方案满足任意匹配对相距不超过 \(2\)。
口胡一个证明:
假设 \(a\) 与 \(a+b\) 匹配,其中 \(b>2\)。
我们设“对应”的双射关系为 \(f\) 与 \(f^{(-1)}\)。
若 \([a+1,n]-\{f^{(-1)}(a+b)\}\) 与 \([1,a+b-1]-\{f(a)\}\) 出现匹配,则由排序不等式,交换两者匹配不劣。
接下来,我们将证明,\(b>2\) 时,其总存在匹配。
因为 \(|[a+1,n]-\{f^{(-1)}(a+b)\}|\ge n-a-1\),而 \(|[a+b+1,n]\cup\{f(a)\}|\le n-a-b+1<n-a-1\),由抽屉原理,必存在 \([a+1,n]-\{f^{(-1)}(a+b)\}\) 中的元素不与 \([a+b+1,n]\cup\{f(a)\}\) 中的元素匹配,即存在 \([a+1,n]-\{f^{(-1)}(a+b)\}\) 中的元素与 \([1,a+b-1]-\{f(a)\}\) 中的元素匹配。
自此,我们得到若存在相距超过 \(2\) 的匹配,我们总可通过一次调整,使之更不劣。
于是,总是存在一个最优匹配方案,满足任意匹配对相距不超过 \(2\)。
\(\rm QED\)。
证明完这点后就可以 dp 了。
考虑对 \(b\) 这一维状压,记录哪些节点已经使用,哪些节点留备后用。
写成矩阵转移,然后用动态 dp 维护。
因为容易发现 dp 的过程中转移矩阵的改变主要体现在 \(f\) 与 \(f^{(-1)}\) 上。
所以稍微分类讨论写出转移就好了。
如果懒,也可以和我一样直接压 \(16\times16\) 的矩阵。
反正数据范围比较小,矩阵单点修改全局乘积线段树维护一下随便过。
然后被卡常了。
矩阵乘法还是要for(uint i=0;i<16;i++)for(uint j=0;j<16;j++)if(a[i][j]>=0)for(uint k=0;k<16;k++)
啊。
正解的结论好牛逼啊,我也不会,没办法,只好这么做了。 - SCOI2016 围棋(\(\rm Easy\))
直接 dp 套 dp 逐行转移草过去了。 - CQOI2015 标识设计(\(\rm Easy\))
轮廓线 dp、插头 dp 狗都不写!
暴力枚举对应哪三列,从上往下暴力转移即可。
然后可以强制有序,乘上系数,来缩小至 \(\frac16\) 倍常数。
20221019
- NOI2021 机器人游戏(\(\rm VeryHard\))
其实这次没看题解,但由于上次看了,就评为 \(\rm VeryHard\) 了。
上次在真题记录一开始就开坑这题,直接寄飞;这次,在 \(100\) 题左右的训练之后,让我们重头开始。
My Solution。
20221021
- CF645E Intellectual Inquiry(\(\rm Easy\))
简单 dp。
20221023
- APIO2016 烟花表演(\(\rm Hard\))
闵可夫斯基和是平凡而好想的,但是想不到可以可并堆直接维护。
20221024
- 十二省联考2019 希望(\(\rm VeryHard\))
其实这次没看题解,但由于上次看了,就评为 \(\rm VeryHard\) 了。
数据真的水,我把乘 \(0\) 的 tag 改成暴力修改直接过了……
My Solution。
20221027
- CF24D Broken robot(\(\rm Easy\))
简单期望 dp。 - POI2013 Triumphal arch(\(\rm Easy\))
稍微要想一下的树形 dp。
要注意 \(n=1\) 时答案可为 \(0\)。 - AGC001C Shorten Diameter(\(\rm Easy\))
比较智慧(套路?)的枚举直径中心。这就是 AGC 吗。
或许可以用长剖做到 \(O(n)\)。
20221028
- APIO2014 连珠线(\(\rm Easy\))
称通过Insert
方法得到的点 \(w\) 为界点。
如果一种分配界点以及每个界点对应蓝边的方案,满足:
每个界点对应其旁某两条蓝边,每条蓝边归属于恰好一个界点;
不存在两个界点 \(u,v\),使得其最简路径上不存在 \(u,v\) 对应的任何蓝边。
则此种分配方案可行。
然后我们就是要求蓝边边权和最大的分配方案。
直接树形 dp 即可。
简单来说,我们要在 dp 状态中记录这么几个东西:
当前是在以节点 \(p\) 为根的子树决策;
当前子树中有没有形如 \(\land\) 的归属方案;
当前子树的根节点是非界点,还是对应形如 \(\big<\) 的归属方案,还是对应形如 \(\land\) 的归属方案。
在记录这些信息的基础上,我们设 dp 数组的值为在给定条件下对应的最大值。
如果不存在,则记为 \(-\infty\)。
直接 dp 即可。
20221029
- CSP-S2021 括号序列(\(\rm Easy\))
考前锻炼一下手感。
20221030
- SHOI2014 概率充电器(\(\rm Easy\))
简单的换根 dp。使用希望的方法直接维护前后缀可回退化信息即可。
20221031
- HNOI2014 世界树(\(\rm Easy\))
简单的虚树 dp。直接倍增即可。 - IOI2000 邮局(\(\rm Easy\))
套路的决策单调性 + 凸优化 dp。(连着加强版一起过了。) - CEOI2017 Building Bridges(\(\rm Easy\))
简单的斜率优化。
20221101
- CF809C Find a car(\(\rm Easy\))
简单异或卷积。
My Solution。 - AHOI2017/HNOI2017 大佬(\(\rm Hard\))
困难的题目。哦,我是憨憨。
因为除了操作二外的日期具体是哪几天不影响状态集,仅与天数有关,因此我们先做一轮 dp 枚举出至少得做几天题,反推出至多能做几次操作二以外操作。
然后暴力 bfs 出所有可行状态。
最后双指针扫描即可。 - POI2015 WYC(\(\rm Easy\))
简单的倍增矩阵幂。
20221102
- BJWC2008 王之财宝(\(\rm Easy\))
简单容斥。 - ICPC2018WF Gem Island(\(\rm Hard\))
困难的题目。
第一步转化不会……
但是后面的 trick 都是 trival 的。
min-max 反演被卡精度了……手写高精才过。
加强版顺带过了。
推导长这样:
\(ans=\mathrm E(\sum_{k=1}^r\max^k_{1\le i\le n}a_i)=\sum_{k=1}^r\mathrm E(\max^k_{1\le i\le n}a_i)\\=\sum_{k=1}^r\sum_{T\subseteq[1,n]}(-1)^{|T|-k}\binom{|T|-1}{k-1}\mathrm E(\min_{i\in T}a_i)\\=\sum_{T\subseteq[1,n]}\mathrm E(\min_{i\in T}a_i)\sum_{k=1}^r(-1)^{|T|-k}\binom{|T|-1}{k-1}\\=\sum_{m=1}^n\binom nm\mathrm E(\min_{i\in[1,m]}a_i)\sum_{k=1}^r(-1)^{m-k}\binom{m-1}{k-1}\)
\(\mathrm E(\min_{i\in[1,m]}a_i)=\sum_kk\mathrm P(\min_{i\in[1,m]}a_i=k)\\=\sum_{k\ge1}\mathrm P(\min_{i\in[1,m]}a_i\ge k)\\=\sum_{k\ge1}\mathrm P(\forall i\in[1,m],a_i\ge k)\\=\frac1{\binom{n+d-1}{n-1}}\sum_k[z^{n+d}]{z^{n+mk}\over(1-z)^n}\\=\frac1{\binom{n+d-1}{n-1}}[z^d]{1\over(1-z)^n(1-z^m)}\)
\(ans=\frac1{\binom{n+d-1}{n-1}}[z^d]\frac1{(1-z)^n}\sum_{m=1}^n{\binom nm\sum_{k=1}^r(-1)^{m-k}\binom{m-1}{k-1}\over1-z^m}\)
\(\sum_{k=1}^r(-1)^{m-k}\binom{m-1}{k-1}\\=(-1)^{m-1}\sum_{k=1}^r\binom{k-m-1}{k-1}\\=(-1)^{m-1}\sum_{k=0}^{r-1}\binom{k-m}k\\=(-1)^{m-1}\binom{r-m}{r-1}\\=(-1)^{m-r}\binom{m-2}{r-1}\)
\(ans=\frac1{\binom{n+d-1}{n-1}}[z^d]\frac1{(1-z)^n}\sum_{m=1}^n{(-1)^{m-r}\binom nm\binom{m-2}{r-1}\over1-z^m}\)
体感非常不适。 - BalticOI2017 Toll(\(\rm Easy\))
乍一眼没思路。观察条件。
注意到 \(k\) 很小。
条件相当于按 \(k\) 分块,然后边只可能从相邻的左边块连向右边块。
整张图是个 DAG。
考虑分治。考虑断掉中间两块之间的边,某些询问会不连通。
目前处理那部分询问,每次钦定最短路中中间左边一块的某个点出发的边必须经过至少一条。
直接转移出最短路即可。然后暴力更新当前层答案。
显然对应区间单次扫描复杂度 \(O(nk)\)。(\(m\sim nk\))
\(k\) 轮扫描即为 \(O(nk^2)\)。
一共会有 \(\log{\frac nk}\) 层分治结构。
总复杂度即为 \(O(nk^2\log{\frac nk})\)。(\(n,q\) 同阶)
扫了眼题解,不懂为什么都是矩阵转移 ddp 人。
20221103
- bzoj4182 Shopping(\(\rm Hard\))
来补 Claris 题了……
当时 Claris 把这题作为点分治入门题……
现在还是想不到这个 dp 的过程。
这个依赖背包的状态设计好高明啊!
至于优化,则要借助于点分治。
20221112
- CF568E Longest Increasing Subsequence(\(\rm Hard\))
这个直接 dp 的思路好高明啊!
这就是我所最不擅长的了……
而且卡空间,所以回推的过程要构造优化…… - HNOI2007 梦幻岛宝珠(\(\rm Easy\))
简单技巧。 - CF150E Freezing with Style(\(\rm Easy\))
二分 + 点分治 + 单调队列,单调队列计算有 dp 思想。
20221114
- CF1295F Good Contest(\(\rm Easy\))
简单的牛顿级数,分段函数优化 dp。
20221115
- CF566C Logistical Questions(\(\rm Hard\))
发现了凸性,但是没有想到求导。
淀粉树上跳 \(\log\) 步,每步 \(O(n)\) 扫全局信息即可。
总复杂度 \(O(n\log n)\)。 - AGC041F Histogram Rooks(\(\rm VeryHard\))
困难的题目。
被打爆了。
20221116
- COCI2017-2018 Sažetak(\(\rm Easy\))
容斥 + exgcd 好题! - BalticOI2007 Ranklist Sorting(\(\rm VeryHard\))
论文题。
20221118
- CEOI2006 Link(\(\rm Easy\))
简单基环树 dp。
20221123
- APIO2016 划艇(\(\rm Easy\))
简单牛顿级数优化 dp。
NOIp 结束了。
摆烂了,这篇不更了。
下转八校杭州集训练习记录。
本文来自博客园,作者:myee,转载请注明原文链接:https://www.cnblogs.com/myee/p/dp-record.html