ZROI 暑期高端峰会 A班 Day6 DP

[THUPC2018]城市地铁规划

(日常讲题之前 YY……)

一眼出 \(O(n^3+nk)\) 做法。

\(dp[i][j]\) 表示前 \(i\) 个点,前 \(i\) 个点度数和为 \(j\) 的最小值。

\[dp[i][j]=\min\limits_{1\le k\le n-1}(dp[i-1][j-k]+f(k)) \]

答案是 \(dp[n][2n-2]\)

我把它优化到了 \(O(n^2\sqrt{n})\),然后就自闭了。

(讲题之后……)

换成 prufer 序列,也就是前 \(i\) 个点,度数-1的和为 \(j\) 的最小值。

\[dp[i][j]=\min\limits_{0\le k\le n-2}(dp[i-1][j-k]+f(k+1)) \]

答案是 \(dp[n][n-2]\)

这有什么好处?发现此时枚举过程中 \(k\) 的上界没有用了。

那么继续修改状态,如果一开始先假设所有点的度数都是 \(1\),接下来考虑替换成别的度数:

\[dp[i][j]=\min\limits_{k\ge 0}(dp[i-1][j-k]+f(k+1)-f(1)) \]

选不超过 \(n\) 个正整数,使得和为 \(n-2\)\(f(x_i)-f(1)\) 的和最大。

此时就是个完全背包。做完之后再还原方案就行了。

复杂度 \(O(n^2)\)

[CTSC2018]假面

之前听懂了,然而当时没来得及写,现在就忘了。

回去再补。

CF53E

\(n\) 个点的图,问有多少生成树,恰好有 \(k\) 个叶子。

\(n\le 10\)。但是可以开到 \(n\le 15\)

(日常讲题之前YY)

明显 DP。

\(f[S][i]\) 表示目前在生成树中填了 \(S\),目前有 \(i\) 个叶子,的方案数。

那么 \(f[\{i\}][1]=1\)

转移,一层一层填。复杂度 \(O(3^nn^3)\)

然而要是 \(n\le 15\) 就挂了。

(讲题之后)

容斥,计算某个集合全是叶子,且没有其它叶子的方案数,转为求某个集合全是叶子,但是可以有其它叶子的方案数。

枚举集合,剩下的求个生成树,然后把叶子挂上去。这里复杂度 \(O(2^nn^3)\)

然后 IFMT 一波就没了。

[NOI2015]寿司晚宴

等价于两人的质因子集合没有交集。

朴素 DP:\(f[i][S_1][S_2]\) 表示前 \(i\) 个人,第一个人集合为 \(S_1\),第二个人集合为 \(S_2\) 方案数。

转移直接枚举给哪个人或不给。可以通过 \(n\le 30\)

\(n\le 500\) 时质因子太多了。但是发现一个性质:每个数至多有一个 \(>22\) 的质因子。

\(2\)\(n\) 的数按大质因子分类。(没有大质因子的,看成一类。)

然后转移时强制一类的数不会同时给两个人就行了。

???

\(n\times m\) 的矩阵,每个矩阵有个权值。

选一些位置,使得它们没有八联通。使得它们权值和最大。

\(n\le 12,m\le 100\)

有个显然的:\(f[i][S]\) 表示填了前 \(i\) 列,第 \(i\) 列选的状态是 \(S\),最大值。

可用状态远小于 \(2^n\)。复杂度一副能过的样子。

不过有个可以稳过的方法:插头 DP。(其实这个不是插头 DP,是个普通轮廓线 DP)。

然后就是 SB 题了。

[清华集训2016] Alice 和 Bob 又在玩游戏

\(n\) 个点的有根森林,两个人轮流选一个点,并将这个点和它的所有祖先删掉。

不能操作者输,问谁会赢。

\(T\le 10,n\le 10^5\)

(日常讲题之前YY……)

发现每次操作后保留的一定是一些子树。

\(f[u]\) 表示以 \(u\) 为根的子树中的 SG 值。

再令 \(g[u]\) 表示 \(f[u]\) 和其所有儿子的 \(f\) 的异或和。

那么发现删掉一条链,之后的异或和就是这条链上所有 \(g\) 的异或和。

然后考虑对于一个点的所有儿子,弄个启发式合并。

问题就变成要有一个数据结构支持插入一个数,全局异或一个数,全局 \(\mathrm{mex}\)

就是一个 01 Trie。

时间复杂度两个 \(\log\)

(讲题之后……)

我tm……切了???

不过 Trie 合并可以不用启发式,就一个 \(\log\) 了。我好菜啊……

???

平面上 \(2n\) 个球。

\(2n\) 个机器人,位于 \((0,1)\)\((0,n)\)\((1,0)\)\((n,0)\)

每次激活一个机器人,会拿走和它坐标轴垂直方向上最近的球。

问有多少种顺序可以拿走全部的球。

\(n\le 10^5\)

\(2n\) 个点,表示每一行和每一列。

对于一个球 \((x,y)\),就从 \(x\)\(y\) 连边,边权 \(x+y\)

激活一个机器人就相当于选择与这个点相邻的所有边中边权最小的删掉。

对于每个连通块考虑。首先肯定要点数和边数相等。

所以是个基环树。问题就是要把这个基环树,每条边定向,使得每个点出度都为 \(1\)

对于环上有两种,顺时针和逆时针。枚举。剩下的点,我们已经知道要用它来删哪条边了。

诶等等,每种方案是还有个系数吧?

嗯,没毛病,\(f[u]\) 表示 \(u\) 的子树中的方案数。

那么对于所有 \(u\) 和它一个儿子相连的边,如果比 \(u\) 和它父亲相连的边边权小,那么肯定是要先选的。否则随便。

那么 \(f[u]\) 就是 \(\prod f[v]\) 再乘上个组合数之类的东西。

时间复杂度 \(O(n)\)

[清华集训2016]连通子树

老师咕了。

[十二省联测2019]希望

老师咕了。

AGC007D

发现路径一定是喂一堆熊,然后走一段后走回去把前面没拿的金币都拿了(不会剩下一些不捡),然后再回去,重复。

那么设 \(f[i]\) 表示前 \(i\) 个金币都捡了并且走到了 \(i\) 的最短时间。

\[f[i]=\min\limits_{j<i}(f_j+(a_i-a_j)+\max(2(a_i-a_{j+1}),T)) \]

按后面的 \(\max\) 分类拆开,然后变成一些区间求最小值的东西。单调队列优化。(草我是个 SB 还用线段树……)

时间复杂度 \(O(n)\)

[POI2011] Lightening Conductor

做过。没了。

LOJ 566

先枚举 \(\mu\)(中位数),把每条边拆成两条边,\(a_i-\mu\)\(\mu-a_i\)。可以变为 \(a_i\)\(2\mu-a_i\)

问题变成给这样一个图,要求包含 \(\lfloor\frac{n-1}{2}\rfloor\) 条第一种边,\(\lceil\frac{n-1}{2}\rceil\) 条第二种边,的最大生成树。

可以 WQS 二分。\(O(m^2\log^2m)\)

咕了。

LOJ 565

首先发现,答案就是(整个过程中一共有多少次进位 - 最后的串中的 1 的个数)的期望。因为一次进位肯定是把两个 1 变成了一个 1。所以答案和操作顺序无关。

从低位到高位考虑。\(f[i][j]\) 表示考虑前 \(i\) 位,\(i\) 这一位一共被加了 \(j\) 次。

\(f[i-1][j]\) 可以贡献到 \(f[i][\lfloor\frac{j}{2}\rfloor]\)

\(pf[i][j]\) 可以贡献到 \(f[i][j+1]\)

\((1-p)f[i][j]\) 可以贡献到 \(f[i][j]\)

(蛤?)

咕了。

posted @ 2019-08-20 14:29  ATS_nantf  阅读(224)  评论(0编辑  收藏  举报