abcdeffa's Blog

当局者迷,旁观者清。

0%

GDKOI2021 S 组简要题解

为什么有个「口胡」的 Tag 呢?因为我可能写不出来。

Day 1

T1

考虑当前确定了前 $k$ 个点所属的集合,现在加入点 $(k + 1)$。

考虑把点 $(k + 1)$ 放在能产生割较多的那个集合里。

由于每次至少产生一半的割,所以最终的总割数一定 $\geq \dfrac{1}{2}|E|$。

比赛的时候写了个不太一样的贪心(不知道能水多少分,但这大概是一道好的 CF 题。

T2

考虑求一下每个 $a_i$ 会成为哪些区间的最小值。如果有相邻两个 $a_i$ 相同的,那么为了避免区间重合,取 $i$ 最大的那个算。

然后你就可以根据已有信息二分出第 $L$ 大了,然后把比第 $L$ 大的值用堆维护,一个一个取即可。

T3

考虑在相邻两个字符之间插一个特殊符号,这样就可以不用将回文串长度的奇偶分类讨论啦。

然后你考虑求出每个位置向左向右能扩展到多少,这个可以用马拉车来做。

我比较菜,所以我写了字符串哈希加二分。

为了方便表述,下文将用第 $i$ 个位置能向左向右同时扩展 $f_i$ 的长度。

然后对于每个询问 $[l, r]$,你二分一下向左向右扩展的长度。

如果你二分的答案为 $d$,那么你考虑一下,如果把 $f_i$ 丢进一棵线段树里面维护,那么答案大于等于 $d$ 当且仅当在区间 $[l + d, r - d]$ 里面有一个大于等于 $d$ 的数对吧。

然后上线段树就完事了?常数太大了!

那就上 ST 表咯。

T4

关于 T4,我已经想到了一种极好的方法,可惜这里太小,我写不下。

Day 2

T1

考虑设 $f_i$ 表示从 $i$ 到 $n$ 的期望局数。

然后有:

其中

然后有 $f_{i + 1} = p_{i + 1}f_{i + 2} + (1 - p_{i + 1})f_i + 1$。

移项,得:

把那个 $(1 - p_{i + 1})$ 除过去,得到:

然后你不停代换到 $f_0$,最后解一下方程就好了。

啊还有另一种方法:

你设 $f_i$ 表示从关卡 $i$ 到关卡 $(i + 1)$ 所需的期望步数。

那么有:

那个 1 就是你无论赢不赢你都要打一盘,赢了就直接过关了,输了就还要加上后面的 $(1 - p_i)(f_{i - 1} + f_i)$ 的代价。

然后那个 $(1 - p_i)$ 就是输了的概率嘛,你输了就会回到第 $(i - 1)$ 关嘛对不对。

然后你再花 $f_{i - 1}$ 局的期望步数到关卡 $i$,然后再花 $f_i$ 的期望局数过关嘛对吧。

然后化简一下上述式子就可以 $O(n)$ 做啦。

T2

你考虑一下,如果 $a_i \geq i$ 的话那么这条从点 $i$ 到点 $a_i$ 的边实际上是没用的,因为你可以一直走最长链上的边到点 $a_i$ 或者你现在就在点 $i$ 对吧。

然后如果 $a_i < i$ 的话你考虑把区间 $[a_i, i]$ 加 1,然后问题就变成了查最左端的一个 0。

随便用数据结构维护一下即可。

T3

这题我被卡常卡到了 70 分,这就是常数大选手的悲哀吗。

你考虑设 $f_i$ 表示完成前 $i$ 个字符所需的最小时间。

然后你发现这个转移好像只和回文中心的 DP 值有关。

然后你考虑在两个字符之间及首尾插入一个特殊字符,这样就不用分回文串长度的奇偶来讨论了,是不是很棒啊?

然后你考虑求出每个位置作为回文中心时最多能够向左向右扩展多长。

然后你求出一个位置的 DP 值后,就把它的 DP 值放在能使它作为回文中心的地方。

然后这就是一个区间修改,单点查询最小值的简单数据结构题啦。

然后只要你写好看点就能过。

果然 $n \leq 10^6$ + 1s 给 $O(n \log n)$ 必有高论?

T4

关于 T4,我已经想到了一种极好的方法,可惜这里太小,我写不下。

我甚至连题解都没看到(这就是文化课选手的悲哀吗?

Day 3

之前一直没想明白自己为什么总是在下一场比赛开始前才开始补上一场比赛的游记。

现在我想明白了,因为考完就放假了。

放假了谁写游记 / 题解啊?

考完 Day 3(san1),回家看番(fan1)!