10.3 国庆集训测试

2021/10/4 23:13:22

本文主要是介绍10.3 国庆集训测试,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Problem A

给一个有向图,\(e_{i,j}\) 表示 \(i,j\) 是否有边。每次操作可以选一个没有删掉的点,将它与它能到达的点全部删掉,问期望多少次能删完。答案对 \(998244353\) 取模,保证图没有自环。

\(1\leq n\leq 1000\)

考虑每个点对期望次数的贡献,根据期望的线性性,对每个点被选的概率求和就是答案。

一个点 \(i\) 能被选当且仅当在所有能到达 \(i\) 的点中(包含 \(i\) ),\(i\) 是第一个出现的。如果记能到达 \(i\) 的点的个数为 \(c_i\) ,答案就是 \(\sum{\frac{1}{c_i}}\) 。

统计 \(c_i\) 时,先缩点成一个 DAG ,然后可以用 \(bitset(i)\) 表示能到达 \(i\) 的点的集合,然后按照拓扑序转移。时间复杂度 \(O(\frac{n^3}{w})\) 。

Problem B

给出 \(S,T\) 两个字符串,问至少删去 \(S\) 中多少个字符,才能使得 \(T\) 不在 \(S\) 中出现。
即不存在 \(l, r\) 使得 \(S[l...r]=T\) 。

\(1\leq length(S),length(T)\leq 8000\)

记 \(dp(i,j)\) 表示考虑 \(S\) 的前 \(i\) 位,匹配到 \(T\) 的前 \(j\) 位(\(j\neq length(T)\))的最小代价。转移时讨论当前位是否删去,删去的转移显然,如果不删去,就需要快速求加上字符 \(s_i\) 后可以匹配到 \(T\) 的前几位,我们可以通过 kmp 快速处理数组 \(trans(i,c)\) 表示已经匹配了 \(i\) 位,加上字符 \(c\) 后匹配多少位。时间复杂度 \(O(n^2)\) 。

Problem C

小 F 最近迷上了华容道,可是他总是要花很长的时间才能完成一次。于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间。

小 F 玩的华容道与经典的华容道游戏略有不同,游戏规则是这样的:在一个 \(n \times m\) 棋盘上有 \(n\times m\) 个格子,其中有且只有一个格子是空白的,其余 \(n \times m −1\) 个格子上每个格子上有一个棋子,每个棋子的大小都是 1 ×1 的;有些棋子是固定的,有些棋子则是可以移动的;任何与空白的格子相邻(有公共的边)的格子上的棋子都可以移动到空白格子上。游戏的目的是把某个指定位置可以活动的棋子移动到目标位置。

给定一个棋盘,游戏可以玩 \(q\) 次,当然,每次棋盘上固定的格子是不会变的,但是棋盘上空白的格子的初始位置、指定的可移动的棋子的初始位置和目标位置却可能不同。第 \(i\) 次玩的时候,空白的格子在 \((EX_i, EY_i)\),指定的可移动棋子的初始位置为 \((SX_i, SY_i)\),目标格子的位置为 \((TX_i, TY_i)\) 。

假设小 F 每秒钟能进行一次移动棋子的操作,而其他操作的时间都可以忽略不计。请你告诉小 F 每一次游戏所需要的最少时间,或者告诉他不可能完成游戏。

\(1\leq n,m\leq 30,q\leq 500\)

设 \(dp(i,j,x,y)\) 表示指定棋子在 \((i,j)\) ,空格在 \((x,y)\) 时的最小步数,因为每一转移只会加一,所以可以用 BFS 转移,时间复杂度 \(O(n^2\times m^2\times q)\) ,无法通过。

注意到空格最开始一定是通过走最短路到一个与指定格子相邻的格子,然后空格一直在与指定格子相邻的位置,所以我们简化状态,设 \(dp(i,j,0/1/2/3)\) 表示指定格子在 \((i,j)\) ,空格在哪个方向的方案数。并预处理 \(f(i,j,0/1/2/3,0/1/2/3)\) 表示指定格子在 \((i,j)\) 时,空格从哪个方向移动到哪个方向的最小步数。时间复杂度 \(O(n^2\times m^2)\) 。



这篇关于10.3 国庆集训测试的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程