• 【LGR-060】洛谷10月月赛 I


    A - 打字练习

    出题:memset0

    送分模拟题,按题意模拟即可。

    需要注意的是对退格键的判断,如果光标已经在行首,则直接忽略被读入的退格键。

    B - 小猪佩奇爬树

    出题:_QAQ

    维护所有相同节点颜色的链并,若不构成一条链则显然答案为 $ 0 $ 。

    若仅包含 $ 1 $ 个节点,则枚举所有子树大小进行统计。

    否则即为链的 $ 2 $ 个端点所对子树大小的乘积。

    C - 小猪佩奇玩游戏

    出题:_QAQ & SPJ:memset0

    容易发现可以将 $ {1,2,dots,n} $ 进行分组,不同组别的答案是独立的。

    举个栗子,对于 $ {1,2,3,4,5,6,7,8,9} $ ,可以将数字分为 $ {1},{3,9},{2,4,8},{5},{6},{7} $

    容易发现这些组别之间互不干扰且互不影响,所以只需要计算每个组别独立的期望值并进行相加即可

    那么最终答案即为

    [sum_{i=1}^{infty} f_i imes g_i ]

    其中 $ f_i $ 表示大小为 $ i $ 的组别个数, $ g_i $ 表示大小为 $ i $ 的组别期望删除多少次,我们分别来计算

    先来计算 $ f_i $ ,显然大小至少为 $ i $ 的组别个数为 $ sqrt[i]{n} $

    对于 $ 1 $ 个大小为 $ x $ 的组别,其为在大小为 $ y $ 的组别中出现 $ lfloor frac{x}{y} floor $ ,所以可以考虑直接容斥计算,复杂度为 $ O(log n^2) $

    显然 $ i $ 最多只能取到 $ log n $ ,所以 $ f_i $ 便很轻松地算出来了

    考虑怎么算 $ g_i $ ,其实等价于给定数列 $ {1,2,dots,i} $ ,每次删除 $ 1 $ 个数及其倍数

    我们考虑一个等价类问题,枚举所有关于 $ i $ 的排列, $ x $ 会产生贡献当且仅当 $ x $ 的前面没有 $ x $ 的因子,那么根据概率的独立性, $ x $ 产生贡献的概率为 $ frac{1}{sigma(x)} $ ,因此有

    [g_i=sum_{x=1}^i frac{1}{sigma(x)} ]

    总复杂度为 $ O(T log^2 n) $

    D - 赛车游戏

    出题:memset0

    一道有意思的图论题。

    对于一个点 $ u $ ,若不存在 $ 1 ightarrow u $ 的路径或 $ u ightarrow n $ 的路径,那么这个点对答案没有影响,可以直接忽略。

    剩下的图一定是一个 DAG。因为如果有环,必定可以形成多条起点到终点的路径,使得无解。

    考虑如何给一个 DAG 赋边权:由于每条 $ 1 ightarrow n $ 的路径长度是相同的,那么每条 $ 1 ightarrow i (i in [1,n]) $ 的路径长度也是相同的。设为 $ dis_i $ ,跑差分约束即可。

    时间复杂度即 SPFA 的时间复杂度 $ O(nm) $ ,实际上常数因子非常小。

    此题的思路和代码都非常清新,只是 SPJ 和构造数据非常恶心,出题人表示体验极差。

    E - 小猪佩奇学数学

    出题:_QAQ

    原式等价于

    [sum_{i=0}^n inom n i imes p^{i} imes frac{i-imod k}{k} mod 998244353 ]

    [sum_{i=0}^n inom n i imes p^{i} imes frac{i}{k} -sum_{i=0}^n inom n i imes p^{i} imes frac{i mod k}{k}mod 998244353 ]

    考虑前半部分式子

    [sum_{i=0}^n inom n i imes p^{i} imes frac{i}{k} ]

    根据

    [frac{m}{n}inom n m = inom {n-1} {m-1} ]

    所以该式子等价于

    [frac{1}{kn} sum_{i=1}^n inom {n-1} {i-1} imes p^{i} ]

    [frac{p}{kn} sum_{i=0}^{n-1} inom {n-1} {i} imes p^{i-1} imes 1^{n-i} ]

    根据二项式定理,即

    [frac{p}{kn}(p+1)^{n-1} ]

    对于后半部分式子容易发现 $ k leq 2^{20} $ ,显然的思路是将数字按照对 $ k $ 的模数进行讨论

    [frac{1}{k}sum_{i=0}^n inom n i imes p^{i} imes (i mod k) mod 998244353 ]

    [frac{1}{k}sum_{t=0}^{k-1} tsum_{i=0}^n inom n i imes p^{i} imes [i mod k = t] mod 998244353 ]

    由单位根反演

    [[i mod k = t]=frac{1}{k}sum_{c=0}^{k-1} w_k^{{(i-t)} imes c} ]

    代入原式,有

    [frac{1}{k}sum_{t=0}^{k-1} tsum_{i=0}^n frac{1}{k}sum_{c=0}^{k-1} w_k^{(i-t) imes c}inom n i imes p^{i} mod 998244353 ]

    [frac{1}{k^2}sum_{t=0}^{k-1} tsum_{c=0}^{k-1}w_k^{-t imes c}sum_{i=0}^n inom n i w_k^{i imes c} imes p^{i} mod 998244353 ]

    发现后半部分很像二项式定理,即

    [sum_{i=0}^n inom n i w_k^{i imes c} imes p^{i}=sum_{i=0}^n inom n i w_k^{i imes c} imes p^{i} imes 1^{n-i}=(w_k^cp+1)^n ]

    那么原式等价于

    [frac{1}{k^2}sum_{t=0}^{k-1} tsum_{c=0}^{k-1}w_k^{-t imes c} (w_k^cp+1)^n mod 998244353 ]

    发现后半部分为关于 $ w_k^{-t} $ 的 $ k-1 $ 次多项式,可以暴力多项式插值,但是这样太慢了

    类似我们考虑将 $ w_k^{tc} $ 看作 $ w_k^{inom {t+c}{2}-inom t 2 - inom c 2} $

    那么原式等价于

    [frac{1}{k^2}sum_{t=0}^{k-1} t^csum_{c=0}^{k-1}w_k^{-inom {t+c}{2}+inom t 2+inom c 2} (w_k^cp+1)^n mod 998244353 ]

    可以看作卷积的形式,那么只需要一次 NTT 就可以带走了,复杂度为 $ O(k log k+k log n) $

    F - 美德的讲坛

    出题:Isonan

    算法1

    我会爆搜!

    复杂度 $ O(2^nq) $ ,期望得分 $ 20' $ 。

    算法2

    设 $ x $ 的最高位为 $ mx $ ,即 $ mxin mathbb{N},2^{mx}le x < x^{mx+1} $ 。

    我们把 $ a_i $ 按照 $ lfloor{a_iover 2^{mx}} floor $ 分组。

    容易发现组内两两异或和都是 $ < x $ 的。

    对于 $ x=2^k,kin mathbb{N}​ $ 的部分分,我们发现分完组以后跨组的异或和全是 $ ge x $ 的。

    我们只要找到最大的组输出就行了。

    复杂度 $ O(n+q) $ ,期望得分 $ 20' $ 。

    算法3

    对于一般情况,我们发现相邻组之间是有可能产生 $ < x $ 的异或和的。

    那么我们的问题变成了:

    现在有两组点,左边每个点有一个权值 $ a_i $ ,右边每个点有一个权值 $ b_i $ 。现在要在左右各选出一些点,使得两两异或和 $ < x $ 。

    我们发现这个东东有点二分图的味道。那么是不是可以网络流呢?!

    我们用如下方法建图:

    源点向左边所有点连边,流量为 $ 1 $ 。

    当 $ a_ioplus b_jge x $ 时,左边点 $ i $ 向右边 $ j $ 连边,流量为 $ infty $ 。

    右边所有点向汇点连边,流量为 $ 1 $ 。

    我们考虑这个图的最小割的意义。

    如果 $ a_ioplus b_jge x $ ,那么 $ i,j $ 之中必定要删掉一个。一个割表示的就是一个删除一些数字,使得剩下数字两两异或和均 $ < x $ 的方案。

    那么我们要求的就是总点数-最小割。

    复杂度 $ O(n^2q) $ ,期望得分 $ 30' $ 。

    算法4

    我们发现连边可以用 $ trie $ 树优化。

    复杂度 $ O(nsqrt{n}lognq) $ ,实现得好能得 $ 50' $ 。

    (不是很会分析复杂度,大概是这样吧)

    算法5

    由于最大流=最小割,我们考虑从最大流的角度入手。

    我们发现这个图的最大流也就是保留 $ a_ioplus b_jge x $ 的边时,该二分图的最大匹配。

    我们可以把这个问题搬到 $ trie $ 树上解决。

    把所有数丢到 $ trie $ 树上。

    设 $ solve(a,b,dep) $ 为 $ trie $ 树上以 $ a,b $ 为根的子树之间进行匹配,两棵子树的最大深度均为 $ dep $ 。

    以下用 $ a0,a1,b0,b1 $ 表示 $ a/b $ 的左 $ / $ 右子树,用 $ |a| $ 表示 $ a $ 中点数。

    当 $ x $ 在 $ dep $ 这一位上是 $ 1 $ 时,只有 $ a0 $ 和 $ b1 $ , $ a1 $ 和 $ b0 $ 可以匹配。

    此时答案就是 $ solve(a0,b1,dep-1)+solve(a1,b0,dep-1) $ 。

    当 $ x $ 在 $ dep $ 这一位上时 $ 0 $ 时, $ a0 $ 和 $ b1 $ , $ a1 $ 和 $ b0 $ 一定可以匹配。

    [|a0| < |b1|\ |a1| < |b0| ]

    [|a0|>|b1|\ |a1|>|b0| ]

    时,答案显然是 $ min(|a|,|b|) $ 。

    否则,以

    [|a0| < |b1|\ |a1|>|b0| ]

    为例。

    我们发现我们只需要额外考虑 $ a1 $ 和 $ b1 $ 的匹配。

    答案即为 $ min(solve(a1,b1,dep-1),b1-a0,a1-b0)+a0+b0 $ 。

    这样基本就做完了。

    我们发现单次修改的时候只会有 $ log $ 个节点被改动,每次只要把这些位置上的 $ solve $ 重新计算就好了。可以类似记搜解决。

    复杂度 $ O((n+q)log^2V) $ ,期望得分 $ 100' $ 。

  • 相关阅读:
    docker初次实验
    一行代码的高阶函数
    ubuntu卸载opencv
    opencv中的数据结构
    微信小程序从0到上线(一)环境搭建
    短链接系统的研究
    西红柿种植经验的个人总结【家庭种植】
    关于微信小程序工具input无法输入的问题
    面向对象的六大原则
    JS API WebSocket
  • 原文地址:https://www.cnblogs.com/nth-element/p/11668765.html
Copyright © 2020-2023  润新知