2021 暑假水题选做

P1850 [NOIP2016 提高组] 换教室

先用 Floyd 预处理出任意两点之间的最短路 \(\operatorname{dis}(u,v)\),然后 dp。

\(f_{i,j,0/1}\) 表示考虑前 \(i\) 门课,有 \(j\) 门课换教室,第 \(i\) 节课是否换教室的答案。

转移就按照第 \(i\) 次换不换与第 \(i-1\) 次换不换分类:

\[\begin{cases} f_{i,j,0}=\min\{f_{i-1,j,0}+\operatorname{dis}(c_{i-1},c_i),f_{i-1,j,1}+k_{i-1}\cdot\operatorname{dis}(d_{i-1},c_i)+(1-k_{i-1})\cdot\operatorname{dis}(c_{i-1},c_i)\}\\ f_{i,j,1}=\min\{f_{i-1,j-1,0}+k_i\cdot\operatorname{dis}(c_{i-1},d_i)+(1-k_i)\cdot\operatorname{dis}(c_{i-1},c_i),f_{i-1,j-1,1}+k_{i-1}k_i\cdot\operatorname{dis}(d_{i-1},d_i)+k_{i-1}(1-k_i)\cdot\operatorname{dis}(d_{i-1},c_i)+(1-k_{i-1})k_i\cdot\operatorname{dis}(c_{i-1},d_i)+(1-k_{i-1})(1-k_i)\cdot\operatorname{dis}(c_{i-1},c_i)\} \end{cases} \]

最终的答案就是 \(\min_{i=0}^m\{f_{n,i,0},f_{n,i,1}\}\)

P3830 [SHOI2012] 随机树

\(q=1\):设 \(f_i\) 表示 \(i\) 个叶子时的答案。我们考虑到当由 \(i-1\) 个叶子变成 \(i\) 个叶子时,会少掉一个期望深度为 \(f_{i-1}\) 的叶子并多出两个期望深度为 \(f_{i-1}+1\) 的叶子,于是:

\[f_i=\frac{(i-1)f_{i-1}-f_{i-1}+2(f_{i-1}+1)}i=f_{i-1}+\frac 2i \]

\(q=2\):设 \(f_{i,j}\) 表示 \(i\) 个叶子时树深度 \(\ge j\) 的概率(注意是概率不是答案),那么

\[E(X)=\sum_{i=1}^{+\infty}P(X\ge i)=\sum_{i=1}^{n-1}f_{n,i} \]

引理:当从 \(i-1\) 个叶子扩展到 \(i\) 个叶子时,不论根的左子树有多少个叶子,根的右子树有多少个叶子,他们的方案数(也即概率)是一样的。

证:设左子树有 \(k\) 个叶子,那么右子树有 \(i-k\) 个叶子。

对于第 \(l\) 次操作,有 \(l\) 个叶子可供扩展,那么左子树的形态有 \((k-1)!\) 种(进行了 \(k-1\) 次操作),右子树的有 \((i-k-1)!\) 种,一共就有 \((k-1)!(i-k-1)!\) 种。

接下来考虑生成它的方案数,可以把它看成是一个由 \(k-1\) 个“扩展左子树”操作和 \(i-k-1\) 个“扩展右子树”操作组成的操作序列,于是方案数为 \(\binom{k-1+i-k-1}{k-1}=\frac{(i-2)!}{(k-1)!(i-k-1)!}\)

总的方案数为 \((k-1)!(i-k-1)!\cdot \frac{(i-2)!}{(k-1)!(i-k-1)!}=(i-2)!\)。这个式子与 \(k\) 无关!证毕。

有了这个结论,转移方程就出来了:

\[f_{i,j}=\frac1{i-1}\sum_{k=1}^{i-1}(1-(1-f_{k,j-1})(1-f_{i-k,j-1}))=\frac1{i-1}\sum_{k=1}^{i-1}(f_{k,j-1}+f_{i-k,j-1}-f_{k,j-1}f_{i-k,j-1}) \]

P2473 [SCOI2008] 奖励关

按照套路设 \(f_{i,S}\) 表示前 \(i\) 个宝物,拿了的宝物集合为 \(S\) 时的答案。然后你发现顺着推不太行。

于是考虑倒着推,设 \(f_{i,S}\) 表示在第 \(1\) 轮到第 \(i-1\) 轮内宝物是否取过的状态为 \(S\),第 \(i\) 轮到第 \(k\) 轮的答案。枚举下一轮出来了哪个宝物,则:

\[f_{i,S}=\sum_{j=1}^n\begin{cases} f_{i+1,S},&s_j\not\subseteq S\\ \max(f_{i+1,S},f_{i+1,S\cup \{j\}}+p_j),&s_j\subseteq S \end{cases} \]

最终答案就是 \(f_{1,\varnothing}\)

CF906D Power Tower

用扩欧递归求解即可,递归次数不会超过 \(\log p\)

CF1439C Greedy Shopping

对于操作 1,要操作的地方是完整的一段。

对于操作 2,要操作的地方是完整的若干段,段数不超过 \(\log\) 级别。

这样就可以转化成一个线段树可以解决的问题了。

具体的做法是线段树二分。操作 1 比较简单,重点讲操作 2。

维护区间和和区间 \(\min\)。首先如果 \(r\lt x\) 或者区间 \(\min\)\(y\) 大,则无解。然后如果这个区间能取就取。最后就往左右子树递归。

P3545 HUR-Warehouse Store

贪心。如果能满足就满足,否则,我们要尽可能地去满足他和他后面的人。此时我们应该放弃前面的人中买了最多东西的人(当然前提是那个人之前没被放弃),用放弃他所省下来的钱去满足当前的人和他后面的人。

要用一个堆维护 前面的人中买了最多东西的人。

CF484A Bits

贪心策略:尽量往低位填 \(1\)

P1792 [国家集训队] 种树

反悔贪心。

维护一个美观度的大根堆。每次取出堆顶然后把答案加上它,然后删掉它旁边的两棵树。

但是同时取两边的树可能比取这棵树要优。所以我们要反悔:弄一个双向循环链表,取堆顶元素 \(a_i\) 时把 \(a_i\) 变成 \(a_{pre_i}+a_{nxt_i}-a_i\)(这就是反悔)再插回去,同时在链表中删去 \(pre_i\)\(nxt_i\)

P4310 绝世好题

暴力:设 \(f_i\) 为只考虑 \(a_1\sim a_i\)\(a_i\) 必须选时的答案,则

\[f_i=\max_{1\le j\lt i,a_i\operatorname{AND}a_j\ne 0}\{f_j\}+1 \]

正解:每次转移的时候按位考虑,设 \(f_{i,j}\) 表示只考虑 \(a_1\sim a_i\),二进制第 \(j\) 位的答案(注意这里不一定要取 \(a_i\))。那么

\[f_{i,j}= \begin{cases} f_{i-1,j},&\operatorname{getbit}(a_i,j)=0\\ \max_{0\le k\le \log(\max a_i),\operatorname{getbit}(a_i,k)=1}\{f_{i-1,k}\}+1,&\operatorname{getbit}(a_i,j)=1 \end{cases} \]

然后这个 dp 状态的第一维可以压掉。

P1484 种树

P1792 双倍经验。

P3620 [APIO/CTSC 2007] 数据备份

P1792 三倍经验。

SP1553 BACKUP - Backup Files

P1792 四倍经验。

P4158 [SCOI2009] 粉刷匠

这个题是一个背包:设 \(f_{i,j}\) 表示考虑前 \(i\) 个木板,粉刷了 \(j\) 次的答案。则:

\[f_{i,j}=\max_{k=1}^{\min(j,m)}\{f_{i-1,j-k}+\text{the answer when painting }i\text{ -th board for }k\text{ times}\} \]

后面的玩意要用另外一个 dp 做:设 \(g_{i,j,k}\) 表示第 \(i\) 个模板,前 \(j\) 个格子,粉刷了 \(k\) 次最多刷对的格子个数,则:

\[\begin{cases} g_{i,j,k}=\max_{l=0}^{j-1}\{g_{i,l,k-1}+\max\{\operatorname{count0}(l+1,j),\operatorname{count1}(l+1,j\}\}\\ f_{i,j}=\max_{k=1}^{\min(j,m)}\{f_{i-1,j-k}+g_{i,m,k}\} \end{cases} \]

P1772 [ZJOI2006] 物流运输

\(f_i\) 表示前 \(i\) 天的答案,那么我们考虑枚举 \(j\),使得在 \(j+1\) 天换航线,\(j+1\sim i\) 航线不变,那么:

\[f_i=\min_{j=0}^{i-1}\{f_j+(i-j)d_{j+1,i}+k\} \]

其中 \(d_{i,j}\) 表示在 \(i\sim j\) 天时 \(1\to m\) 的最短路。

P2939 [USACO09FEB] Revamping Trails G

\(f_{i,u}\) 表示当前在 \(u\) 结点,用了 \(i\) 次高速的答案,那么:

\[f_{i,u}=\min_{(v,u)\in E}\{f_{i,v}+w,f_{i-1,v}\} \]

P3874 [TJOI2010] 砍树

树上背包模板。设 \(f_{u,j}\) 表示以 \(u\) 为根的子树选 \(j\) 个点的答案。则:

\[f_{u,j}=\max_k\{\operatorname{merge}(f_{v,k},f_{u,j-k})\} \]

P1941 [NOIP2014 提高组] 飞扬的小鸟

\(f_{i,j}\) 表示横坐标为 \(i\),高度为 \(j\) 时最少的点击次数。

转移时分三类考虑:从 \(i-1\) 往上走而来,从 \(i\) 继续往上而来,从 \(i-1\) 往下掉而来。

注意 \(j=m\) 时要特殊考虑。

P4374 [USACO18OPEN] Disruption P

直接做不好做,考虑每条新边对答案的贡献。

显然一条边 \((u,v)\) 只能对 \(u,v\) 间的路径做贡献,然后这题就做完了。

注意这里的树剖要边权转点权。

P3976 [TJOI2015] 旅游

题解

CF985F Isomorphic Strings

挺妙的一道题。

我们考虑一个字母在这个区间的出现状况,用 \(\texttt{01}\) 表示,然后对这个串 hash。

\(26\) 个字母都这么做一遍,如果对于一个字母有一个和它对应的 hash 值(就是说 \(26\) 个字母和 \(26\) 个 hash 值构成一一映射),那么这个是可行的。

CF961F k-substrings

考虑当一个字符串的头尾都去掉后,它的 border 会发生什么:

我们发现中间彩色部分依然是一个 border,而且这个新的 border 可能不止彩色部分。

用一个指针维护下 border 的两个端点就行。

CF1144E Median String

把两个字符串看成两个 \(26\) 进制数 \(a,b\),那么答案就是 \(\frac{a+b}2\)

P2577 [ZJOI2004] 午餐

先按照吃饭时间排序,这样吃饭慢的人先打饭可以节约时间。

然后设 \(f_{i,j}\) 表示前 \(i\) 个人在第 \(1\) 个窗口打饭用了 \(j\) 分钟的答案,那么在第二个窗口就用了 \(sum_i-j\) 分钟打饭。

\[f_{i,j}=\min\{\max\{f_{i-1,j-a_i},j+b_i\},\max\{f_{i-1,j},sum_i-j+b_i\}\} \]

[NOIP2000 提高组] 乘积最大

\(f_{i,j}\) 表示前 \(i\) 位分割 \(j\) 次的答案,则:

\[f_{i,j}=\max_k\{f_{k,j-1}\cdot\operatorname{int}(s_{k+1}\cdots s_i)\} \]

于是这个题要用高精,Python 3 水过去。

CF1110D Jongmah

题解

CF282E Sausage Maximization

首先那个区间不能重叠的条件是可以忽略的,因为 \(x\oplus x=0\)。然后就是一个 01trie 了。

CF1525D Armchairs

\(f_{i,j}\) 表示前 \(i\) 个人坐前 \(j\) 把椅子的答案,则:

\[f_{i,j}=\begin{cases}f_{i,j-1},&a_j=0\\\min\{f_{i,j-1},f_{i-1,j-1}+|pos_i-j|\},&a_j=1\end{cases} \]

P6394 樱花,还有你

背包 dp + 前缀和优化。

CF1077F1 & CF1077F2 Pictures with Kittens

\(f_{i,j}\) 表示考虑 \(a_1\sim a_i\) 选了 \(j\) 个,\(a_i\) 必须选的答案。则:

\[f_{i,j}=\max_{i-k\le l\le i-1}f_{l,j-1}+a_i \]

可以单调队列优化。

有一个细节:枚举 \(j\) 的时候要倒着枚举。

CF459E Pashmak and Graph

先排序,这样就没有后效性了。

\(f_i\) 表示考虑前 \(i\) 条边的答案,\(mx_u\) 表示当前考虑到的所有边 \(\langle v,u\rangle\) 中,\(f\) 的最大值。设第 \(i\) 条边为 \(\langle u,v\rangle\),则:

\[f_i=mx_u+1 \]

然后因为边权必须是严格递增的,所以每次处理时要把所有边权相同的边一起处理。

P4720 【模板】扩展卢卡斯定理/exLucas

题解

P2183 [国家集训队]礼物

根据小奥知识,答案是 \(\binom{n}{w_1}\binom{n-w_1}{w_2}\cdots\)

exLucas 计算即可。

posted @ 2021-07-12 20:22  registerGen  阅读(53)  评论(0)    收藏  举报