Live2D

Solution Set -「LOCAL」冲刺省选 Round I

Summary

  状态还行叭。

  A 题又犯坏习惯,走起来就大力分讨,上了个厕所之后冷静一下开始寻找比较普适性的 DP 状态,然后几乎就切掉了,可惜复杂度写假了没发现(已经预处理过的前缀和一个一个加,笑死)。

  B 题的解法暗示性很强,随便猜一个结点出来套路性 DFS 树就好,比较迅速。

  C 题骗的时候就走得有点偏,问题没有抽象清楚,虽然有暴力分,但和正解毫不相关。这个正解确实太神奇了。

Solution

A Sequence

  给定 n,k,m,{am}{am} 的值域是 U=[1,k]N。定义值域也是 U 的序列 {bn} 是好的,当且仅当它存在一个长度为 k 的子序列不含重复元素。求在所有的 {bn} 中,{am} 作为连续子序列的出现次数。

  mn2.5×104k400


  首先,光是 {am} 就能让 {bn} 合法的情况直接判了。

  出现次数,还允许重复,n 也不大,所以先直接枚举出现位置。设现在 {am} 左边还能加 l 个元素,右边还能加 r 个元素。注意到若 {am} 包含重复元素,左边和右边出现合法段(使 {bn} 合法的段)的情况是互不影响的,不可能存在跨过 {am} 的合法段。稍微抽象一下可以得到这样一个 DP 问题:

  给定一个确定的,长度为 j 的子序列 {cj},在其后面添加 i 个元素,使得 {ci+j} 合法,我们记这样的添加方案数为 f(i,j),特别地,f(i,k)=ki。转移显然有

f(i,j)=(kj)f(i1,j+1)+t=1jf(i1,t).

可以 O(nk) 得到。两边方案数小小容斥一发就能求到 {am} 包含重复元素时的方案。

  不包含重复元素,注意到此时 m<k400,所以可以大力钦定几个位置让它出现重复,规约到前一种情况。具体地,设在 {am} 前面添加了第 i (i+mk) 个元素时,这个元素与它后面的第 j 个重复,且前 i1 个元素都没有产生重复。枚举此处的 i,j,在这种情况下,令 {ti+m} 表示添加得到的序列,那么其最长不重复前缀长度为 p=j,最长不重复后缀长度为 q=i+m1,结合已经枚举的 l,r,此处方案数为

+f(li,p)kr+f(r,q)klif(li,p)f(r,q),

注意 i1 个不产生重复的元素还会产生 (km)!/(kmi+1)! 的系数,记得乘上。

  现在算法复杂度是 O(nk2),优化很显然:上式对 j 求和的部分可以滚前缀和。因此最终复杂度为 O(nk)

B Graph

  给定含有 n 个结点 m 条边的强连通有向图,若 u 到任意结点 v 都有且仅有一条简单路径,则称 u 是好的。求出所有好的结点 u

  多测,n105m2×105,保证每个图中至少有 20% 的好点。


  判 u 好不好:DFS 一遍,每个访问到的已被遍历过的结点都必须在当前的递归栈内。

  从 20% 的条件入手,不要白不要嘛,随便猜几次得到一个好点 r。这个“好”字对 r 的限制非常强,分析一下可知:r 为根的 DFS 树唯一,且仅存在外向树边和返祖边。

  以此为基础,判断其他结点的好不好。对于 ur,如果 u 子树内包括两条及以上到 u 严格祖先的返祖边,显然 u 不好;否则 u 子树内必然存在恰好一条到 u 严格祖先的返祖边(图强连通),如果这个祖先好,u 就好,否则 u 就不好。画画图比较明显。

  DFS 一遍求出最浅返祖边和次浅返祖边,再 DFS 一遍判断即可。复杂度 O(m)

C Shape

  Cov. 「CF 1290F」Making Shapes; my solution.

posted @   Rainybunny  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示