0%

[3rd ucup] Zielona Góra 站选做

有点奇怪的一场,有一些通过人数稍少但反而简单的题。

感觉有几个我没做出来的题不算难,导致我感觉我是个唐氏。

比赛链接

E. Pattern Search II

题意

定义

给定一个由 构成的串

找出一个最短的串 ,满足 的子序列,且 的子串。

题解

首先可以发现, 这个串里面不会出现 这两个子串。

换句话说, 中相邻三个字符,一定至少出现了一个 和一个

也就是说,答案一定不会超过

考虑如果我们找到了一个合适的 ,使得 的子串,这代表了什么。

我们知道

假设 完全在 中,那么这很牛。

否则我们可以知道, 中一定是 的右边和 的左边一段拼起来。

那么考虑如果 ,『 的右边』就一定在 这一部分以内,『 的左边』就一定在 这一部分以内。

这说明 的子串。

综上所述,如果 并且 的子串,那么 一定是 的子串。

这就说明,我们只需要找一个 满足 ,那么我们直接在 里面找答案就好了。

那么现在问题在于,如何找答案。

考虑到硬做肯定是不太好做的,那么我们就必须要利用这个串的特殊性质。

那么这个串有什么性质呢,

那么就设 表示在 中匹配 这一段,可以匹配到哪里(以及如果匹配完了需要多长)。

就会有 。考虑到 大约是 级别的,所以算出这个 dp 值是 的。

然后直接枚举 中的起点,然后根据这个 dp 的值算出结尾位置即可。

时间复杂度

提交记录

L. Chords

题意

圆上有 个点,被随机分成了 个弦。

找出一个弦的集合,使得其中任意两条弦不相交,使得这个集合大小最大。

题解

有点脑瘫了。

首先断环为链,设 表示只选两端点都在 这个范围内的弦,答案最大是多少。

一共两种情况,第一种是不选 对应的弦,此时贡献是

第二种情况是 是某条弦的左端点,其对应的右端点 满足

那么这种情况的贡献是

这样就得到了一个 的做法。

考虑因为数据随机,所以答案不会太大。

所以设 表示最小的 ,使得

时间复杂度

提交记录

J. Polygon II

题意

现在有 条线段,第 条线段长度是 间的随机实数。

求出这些线段能够组成一个 边形的概率。

题解

感觉和我想象的做法完全不一样,有点牛。

设第 条线段长度为 ,那么容易发现一组方案不合法当且仅当存在一个 使得

同时容易发现,如果一组方案不合法,那么只会出现一个这样的

也就是说,我们可以考虑计算方案不合法的概率,即

同时我们知道 是在 内均匀随机的,这个东西他非常的对称。

所以有

问题在于这个东西怎么计算,考虑所有 的随机范围是一个 的次幂,所以考虑按照二进制位来考虑。

为一个随机变量,满足 。设 间的随机实数。

发现可以直接拿 来代替

表示已经考虑完了所有 取值,当前 的二进制下最低 位,恰好 的概率

转移是比较容易的,唯一可能出现问题的地方在于 怎么算。

容易发现这相当于算 内随机实数变量,和 的概率是多少。

这可以看成一个 维空间中,一个边长为 的超立方体中,各维坐标和 的点体积是多少。

直接对边长为 的超立方体这个条件进行容斥即可。

时间复杂度

提交记录

B. Roars III

题意

给定一棵 个点的树,初始时你已知某些点上有一颗石子。

现在可以进行若干次操作,每一次操作是选择一个石子,并向其将点 移动一步,要求不能有两个石子同时在一个点上。

对于每一个 ,求出石子移动的最大次数。

题解

先考虑如何对单个 求出答案。

考虑找到一个最深的点 ,使得 上当前没有石子,并且 子树内至少有一个石子。

那么我们找到 子树里面的一个点 ,满足 上有石子且深度最深。

(注意到此时 这条链的所有点上都有石子)

那么我们贪心的把 这一段石子统一往上移一个位置。

使用线段树维护这种东西,单个 就可以 算出来。

那么考虑直接加一个换根就过了。

时间复杂度

提交记录

I. Mercenaries

题意

现在有 个城市和 条道路,第 条道路连接了城市

每一个城市都有一个勇士,第 个城市的勇士力量属性为 ,魔法属性为

每一条道路上都有一个商店,第 条道路上的商店有 个物品,属性分别为

若一个勇士当前在城市 ,则他可以走到城市 去,并在第 条道路的商店购买至多一个物品。

购买的物品的力量、魔法属性将会直接加给这个勇士。

给定 次询问,第 次询问中,第 个城市出现了一个怪物,属性分别为

一个力量为 ,魔法为 的勇士能打败他当且仅当

求一个最大的 ,使得第 个城市的勇士走到城市 后能打败这个怪物。

题解

可能是这场最难的题,给了我一种我想出来不太可能,但是想不出来很脑瘫的感觉

考虑将人和道具都看成二维平面上的点,那么如果这里有一坨点,只有他们的右上凸壳是有用的。

考虑假如我们走过了两条路,这两条路拿道具的方案很多,但是由于只有凸壳上的点有用。

所以我们只需要把两条路的凸壳做闵可夫斯基和,就能得到从两条道路上拿道具的方案数。

所以用线段树直接维护每一个树上的区间,人和道具组成的凸包。

合并两个区间就是左边的人和右边的道具做闵可夫斯基和,然后再和右边的人放一起再求一遍凸壳。

然后把所有询问离线下来,按照 进行排序,然后线段树上二分。

复杂度是单 的。

提交记录