20241010 模拟赛(植物收集,美丽子区间,字符序列,网络攻防)

想看题的戳这里

A. 植物收集

难度:绿
先讲一下 \(O(n^3)\) 的暴力:
枚举一下要用多少个 \(k\)。将价格排序,假设要用 \(x\)\(k\),则每个数会对其右边 \(x\) 个数产生贡献,按价格从小到大计算贡献。
优化一下,每次增加一个 \(k\),则每株植物最多往右边贡献 \(1\) 个,所以每次往右边枚举一个数,复杂度 \(O(n^2)\)
还能优化!观察一下,发现对于每个 \(x*k\) 的贡献可以三分!再加上ST表,时间复杂度达到 \(O(n\ log\ n)\)

B. 美丽子区间

难度:绿
利用容斥原理,有:

美丽子区间数 = 区间数 - 最大值在开头的子区间数 - 最大值在结尾的子区间数 - 最小值在开头的子区间数 - 最小值在结尾的子区间数 + 最大值在开头最小值在结尾的子区间数量 + 最大值在结尾最小值在开头的子区间数量

对于减掉的部分,可以用单调栈计算;而加回去的部分,可以用树状数组解决,具体看代码。

C. 字符序列

难度:蓝
原题UOJ516。
神奇计数dp+矩阵乘法。
\(dp_{i,j}\) 为字符串 \(1\sim i\) 位,以字符 \(j\) 为结尾的子序列数,其中 \(j\)\(a\sim z\)
又设 \(lst_j\) 为字符 \(j\) 上一次出现的位置。
所以有 \(dp_{i,j}=\sum\limits_{k=a}^z dp_{lst_k,k}\)
发现这玩意是可以省一维的,即有 \(dp_i=\sum\limits_{k=a}^z dp_{lst_k}\)
但是这样还不够,因为字符串长度会达到 \(2^n\) 级别,空间时间双爆炸。
\(t(i)\) 为进行依次进第 \(i\sim n\) 次操作得到的字符串,于是有 \(t(i)=t(i+1)+s_i+t(i+1)\)
用一个矩阵乘法,可以达到 \(O(n)\) 级别。

D. 网络攻防

难度:蓝-紫
首先,\(k=1\) 的时候tarjan算割边数就行了。
对于 \(k=2\),我们先从这张图中抽出一棵生成树。这样有三种情况:

\(1.\) 删除两条非树边,贡献为 \(0\)

\(2.\) 删一条树边,一条非树边。

若树边为桥边,则另外一条怎么选都行。
若不是,则该非树边应为生成树上唯一覆盖了这条边的非树边。
这里的覆盖是这样的:

其中,黑色边为树边,红色边为非树边,打勾的边是被覆盖的边。

\(3.\) 删两条树边。

若树边中存在桥边,无脑删就行了。
若不存在,则删除边 \(a,b\) 后图不连通的条件为覆盖了边 \(a\) 的非树边集 \(S_a\) 与覆盖了边 \(b\) 的非树边集 \(S_b\) 满足 \(S_a=S_b\)。可以自行手推一下。

于是,就有一个问题:怎么判断 \(S_a=S_b\)?对于这种边的相等问题,一般是用哈希解决。

posted @   nagato__yuki  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示