Loading

2024牛客多校3&4

3

D.Dominoes! (D)

赛时没理解xht的贪心思路,哭)

首先考虑无解情况,排好的序列中算上两端、至多只能出现 \(n-1\) 个相同的数,于是当某个数出现次数大于 \(n-1\) 时,必然无解。

对于两端数字不相等的牌,以任意顺序从左至右排列,若数字重复,将牌左右翻转即可,因此必然有解;可见应优先设计数字相等牌的排列方式。以相等数字出现次数多少为顺序选取骨牌,相同骨牌错开放置,若只剩下一种相等数字,则加入余下的数字不相等牌。可以证明,当任何数出现次数都不大于 \(n-1\) 时,该策略一定能排列出合法解。

代码实现比较简单,主要难度在于贪心策略与证明,万一证不明白也可以先交一下试试(确信)

E.Malfunctioning Typewriter (E)

\(n\) 个字符串建立01 trie,\(sz[i]\) 表示经过 \(i\) 节点的字符串数量,可在加入新的字符串时维护。\(sz[l[i]]\)\(sz[r[i]]\) 分别为当前待选位置为 \(0\)\(1\) 的字符串总数,由于最终需要打出每个字符串恰好一次,即 \(i\) 下方的每个字符串都被遍历一次,走到 \(i\) 位置时,应当有 \(sz[l[i]]\) 次打出 \(0\)\(sz[r[i]]\) 次打出 \(1\);而每个节点向 \(l\)\(r\) 走的情况不受其他节点影响,答案即为所有节点满足该条件的概率之积。

dp预处理打出 \(x\)\(0\)\(y\)\(1\) 的最大概率 \(f[x][y]\),有 \(f[x][y] = max(p * f[x - 1][y] + (1 - p) * f[x][y - 1],\space\space p * f[x][y - 1] + (1 - p) * f[x - 1][y])\). 注意对这个转移方程的理解:为计算最优情况,当打出 \(x\)\(0\)\(y\)\(1\) 的最大概率低于 \(x\)\(1\)\(y\)\(0\) 时,应将先前策略优化,即倒换输出的 \(0\)\(1\). 因此在最后计算答案的过程中,\(f[sz[l]][sz[r]]\)\(f[sz[r]][sz[l]]\) 实际上是等价的,也可以将该状态式理解为“打出两种不同的字符,其中某一种有 \(x\) 个、另一种有 \(y\) 个的最大概率”,最后选择需要的01情况。

4

A.LCT (A)

说实话lzz提出dfs+并查集就可以做的时候,我宕机了一瞬间······ 然后“啊啊啊啊啊我长个脑子是干什么用的”

非常好并查集,使我的大脑旋转,爱来自基础数据结构。

假设将 \(u,v\) 节点连边,其中 \(u\)\(v\) 的祖先,动态维护新树的最大深度,需求出 \(u\) 的当前深度与 \(v\) 原有的的最大深度。由于最终形成一棵有根树,每个节点在该树中的深度是固定的,可先建出最终树结构,dfs预处理出 \(dep\) 数组;并查集可查询节点 \(u\) 的当前根节点 \(f[u]\),其当前深度即 \(dep[u]-dep[f[u]]\) 。用 \(now\) 数组存储当前根节点下的最大深度,连边时即有 \(now[f[u]]=max(now[f[u]],now[v]+dep[u]-dep[f]+1)\)\(O(1)\) 查询即可。

F.Good Tree (F)

lzz一眼丁真发现了一个规律:要使 \(f(u)-f(v)\) 最大化,最优结构为链状,此时 \(u\) 在端点,\(v\) 在中间位置。于是可以很方便地算出每个节点数 \(n\) 对应的 \(xmax\),此时我们认为 \(x\leq xmax\) 时必然可以用 \(n\) 个节点构造出 \(f(u)-f(v)=x\),于是决定二分答案。

然而在多次WA之后,问题变得不太对劲起来。经过验算,他的规律找不出任何问题,于是我开始怀疑构造过程中是否存在例外情况。根据换根dp的典题思路,若 \(x,y\) 两节点有直接连边,将该边视作“分界线”,\(f[y]\)\(f[x]-x\) 左侧部分节点数 \(+\space y\) 右侧部分节点数,当 \(n\) 为偶数时,无论如何移动,两侧节点的数量差只能是偶数,因此无法构造出奇数的 \(x\) 值;而 \(n\) 为奇数时,数量差为奇数,可以通过多次移动凑出偶数,不受影响(所以样例没把我们的错解卡掉TAT)

在二分答案后加上特判,若 \(n\) 为偶数且 \(x\) 为奇数,则 \(ans=n+1\),否则 \(ans=n\),终于能过了(欣慰)

J.Zero (J)

好一道推式子题,真是太有趣啦!(精神不太稳定.jpg)

\(p_{ix}\) 为以 \(i\) 结尾,连续 \(x\) 个1字符的概率,\(f[i][j]=\sum\limits_{x\geq 0}{p_{ix}(\sum\limits_{l=1}^x l^j)}\),即有 \(ans=\sum\limits_{i=1}^n f[i][k]\). (注意此处先对 \(l\) 再对 \(p*x\) 求和,否则会漏算部分情况下的期望。)考虑递推求出 \(f\) 数组:当 \(s[i]=1\) 时,\(f[i][j]=\sum\limits_{x\geq 1}{p_{(i-1)(x-1)}(\sum\limits_{l=1}^x l^j)}=\sum\limits_{x\geq 1}{p_{(i-1)(x-1)}*(\sum\limits_{l=1}^{x-1} l^j)\space +\sum\limits_{x\geq 1}{p_{(i-1)(x-1)}*x^j}}\). 前项等于 \(f[i-1][j]\),后项继续化简:

原式 $=\sum\limits_{x\geq 0}{p_{ix}*(x+1)^j}=\sum\limits_{x\geq 0}{p_{ix}(\sum\limits_{m=0}^j{j\choose m}x^m)}=\sum\limits_{m=0} ^j {j\choose m}\sum\limits_{x\geq0} p_{ix}* x^m $.

设 $e[i][j]=\sum\limits_{x\geq0} p_{ix}* x^m $, 则运用类似的递推思想可得:

$e[i][j]=\sum\limits_{x\geq1} p_{(i-1)(x-1)}*[(x-1)+1]^m=\sum\limits_{m=0} ^j {j\choose m}e[i-1][m] $.

\(s[i]=?\) 时,\(f=f/2\)\(s[i]=0\) 时,\(p=0,f=0\).

由此可 \(O(k^2)\) 复杂度求出 \(e\),再递推得 \(f\),总时间复杂度为 \(nk^2\). 听说有更快的解法,但显然我不会

P.S.

这两场相对简单的几个题也挺有趣,第四场赛时和xht说看到H的操作过程就想起辗转相除,当时自己都觉得好笑,没想到他说他也这么想,并且已经写出代码了,我:????好好好,看来还是低估了出题的抽象程度。(后来仔细想想,这还真就标准的辗转相除过程,是我数论快忘了记忆模糊导致的)

能补的题目还有一两道没补完,继续加油吧(落泪)

posted @ 2024-07-28 19:26  Aderose_yr  阅读(8)  评论(0编辑  收藏  举报