AT3949 [AGC022D] Shopping 题解

Atcoder
Luogu

P.S.

和 @Lillia 从 8:00 嘴巴到 8:45,总算嘴巴出来了个做法。

Solution.

首先,画一张 时间-位置 图。
AT3949 [AGC022D] Shopping 题解
如果有这样的商店,容易证明它搭乘向左的列车肯定不劣,我们定义它为左箭头。
AT3949 [AGC022D] Shopping 题解
同理,左边也会有只能向右的箭头,定义为右箭头。
当然还有不左不右的箭头,又需要分类。
有种商店,定义为同向商店,下车和上车列车前进方向相同。
AT3949 [AGC022D] Shopping 题解
当然还有不同向商店(如图
AT3949 [AGC022D] Shopping 题解
有一些比较显然的性质:

  • 不存在一个左箭头它在右箭头左边
    • 证明的话直接考虑左箭头必须在序列的中点左边,右箭头必须在序列中点右边即可
  • 同向商店完全没有用,直接在列车经过它时消费掉即可
    • 证明就考虑根本没法优化,前后本质相同。

然后把同向商店去掉后,不同向商店本质上来说就是一个既可以当作左箭头又可以当作右箭头的箭头,称它为双向箭头。
原问题转化成了有很多箭头,需要把它划分成尽量少个存在合法排序方式的子集。
一个序列合法当且仅当如果存在,每个箭头的后继相对于当前这个箭头的方向就是这个箭头指向的方向。
不就是在每个箭头上往那边前进找到下一个嘛。。。
然后发现这个双向箭头很毒瘤。

考虑

上一篇:shopping


下一篇:CF1439C Greedy Shopping