ZLOJ 练习68 总结
written on 2022-08-16
这场比赛打得不好,既有主观原因也有客观原因,就不多提了。
\(A\) 题水题,可以照着题意的思路很容易想到模拟的方法,中间打错了一个小细节挂了一个半小时十分痛苦,以后要注意。
\(B\) 题 贪心,很显然题目要求字典序最小,那么我们就可以考虑贪心的逐位填入较小的字符。在贪心的时候需要考虑这样的放置会不会使后续离不合法更进一步最终导致无解,这是贪心需要证明(感性理解)的部分。
首先下一个能放的前提是满足 \(suma\leq cntb+cntc,sumb\leq cnta+cntc,sumc\leq cnta+cntb\),\(cnta\leq sumb+sumc,cntb\leq suma+sumc,cntc\leq suma+sumb\),那么我们需要考虑该前提是否是后续能够存在至少一种放置方案的充要条件。由于变量较多,各种变量间有关,因此考虑一种构造方案。对于 \(\tt{b},\tt{c}\) 的放置,先用 \(suma\) 放满,剩下的 \(\tt{b}\) 只能用 \(sumc\) 来填,而条件中又有 \(cntb\leq suma+sumc\),因此 \(b\) 是可以放满的,同理 \(a,c\) 均可以被填满,且所有的都满足。
这个贪心的条件式子并不是很难,但是理解其正确性还是要稍微思考一下的,正式比赛的时候由于有六条式子强度较高,可以不证明\kk
\(C\) 题 的思路是对的,但是被卡空间了最后没有过\ll
这里具体过程就不讲了可以参见一下其他题解。主要是记录数值的部分,由于这个数值可能很大,而向上传递的过程中有许多 \(\times 2\) 的操作,因此用一种特殊的方式记录数值,记录前面的数字和最后 \(0\) 的个数,然后用类似高精的形式重定义运算就可以卡空间过了。
\(D\) 题 最小生成树,暴力建边显然爆炸,所以这题的考点又在于优化建边数量(之前有道题也是优化的建边数量)。我们可以先猜想结论然后证明其正确性。很明显我们可以猜到,对于值为 \(d\) 的点,若有 \(dk\lt x\lt y\lt d(k+1)\),那么不需连接边 \((d,y)\)。
证明一下,\(val_{d\rightarrow x}=x-d\),\(val_{x\rightarrow y}\leq y-x\),\(val_{d\rightarrow y}=y-d\),于是有 \(val_{d\rightarrow x}+val_{x\rightarrow y}\leq val_{d\rightarrow y}\),所以这条边一定不是最优的,可以不连。
最小生成树优化建边数量的证明大多都是以这种形式呈现的,只不过内部过程略有变化,需要掌握。
由于 \(p\) 相同的节点值为 \(0\),可视作同一个点,因此 \(\tt{unique}\) 去重,然后对于每一个点,以倍数的形式向上跳,另外开一个桶记录后缀最值,然后连边即可。
看一下时间复杂度的证明,去重后最多 \(10^5\) 个点,逐个递增,值域最大 \(10^7\),这样子跳的话,构成一个带乘法系数调和级数的数列,我们可以用计算机略略计算一下计算次数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long double ans=0;
for(int i=1;i<=100000;i++) ans+=10000000.0/i;
printf("%.10Lf\n",ans);
}
最劣大概达到了 \(1.2\times 10^9\),不能过,但是这题时间给了 \(8\) 秒,明摆着要我们卡常,所以加一些玄学优化就能过了。。具体可以参见代码。
\(E\) 题 涉及期望、KMP 两个部分,需要好好总结一下。
首先我们还是先思考一下期望的计算方法。这里很显然我们是用 dp 的形式转移,考虑决策。显然,若设 \(E_x\) 表示第一次出现前 \(x\) 个字符的期望次数,那么根据期望的线性转移,应当以 \(E_{x-1}\) 为出发点进行决策判断。显然有两种情况:直接匹配,则 \(val=\dfrac{1}{m}\times 1\);否则失配,此时我们设 \(P_{x-1,k}\) 表示位置 \(x-1\) 失配,末位为数字 \(k\) 的匹配位置,则 \(val=\sum\limits_{k} \dfrac{1}{m}\times (E_x-E_{P_{x-1,k}}+1)\),然后两种情况累加,再加上基础的 \(E_{x-1}\),即列出一条方程,移项然后解出 \(E_x\)。
有关 KMP 的理解的话其实还不是很透彻,但是现阶段只要明确,指针 \(j\) 表示当前匹配的末位,\(fail\) 数组表示最长公共前后缀的长度,然后了解 while 的操作步骤即可。这样的话一般的题目都已经够用了。虽然从科学的角度来看这太愚蠢了但是现阶段能力不足不得不跳过