Atcoder Beginner Contest 299 G

对于要打印的 B,我们首先尝试确定 B1

f(x)(1xM) 是最大的 i,使 Ai=x
对于 r:=min1xMf(x),我们可以证明 B1A1,A2,...,Ar 中的一个(否则,BA>r:=(Ar+1,Ar+2,...,AN)的一个子序列,但 A>r 不包含 Ar,这违反了 B 的条件)。

相反,存在一个长度为 M 的子序列,其第一个元素是 Ai 中的一个 (1ir),它分别包含 12...M 一次。特别是,所有 Af(x) 的子序列的 x 都有 xAi

因此,B1=Al=min1irAi。我们可以让 l 是最小的整数 j,使Aj=min1irAi

我们可以通过对以下序列重复类似的问题来确定B的所有元素(对元素进行适当的替换):

A 中除去前 l 项和所有使 Ai=B1 的元素而得到的序列。
对一个序列的操作可以用一个优先级队列或一个段树来模拟。

在使用优先级队列管理 (Ai,i) 的情况下,我们可以通过把前r个词放在一起并找到它们的最小值来找到前 r 个元素的最小值。
移除 A 的前 l 个元素,并移除与某物相同的 Ai,可以通过重复从优先级队列中移除一个元素来实现,只要队列中的顶级元素满足一个条件。
在段树的情况下,我们也可以做类似的事情。

移除与某事物具有相同价值的 Ai,可以通过替换该 Ai 来实现。 删除时用 来实现。
替换后,前 r 个元素的最小值是一个分段最小值。
这两种方法的时间复杂度都是 O(NlogN),足够快。

Translated by Empty_Dream

作者:DE_aemmprty

出处:https://www.cnblogs.com/aemmprty/p/ABC-299-G-Solution.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   DE_aemmprty  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示