AtCoder Regular Contest 080 E - Young Maids

AtCoder Regular Contest 080 E - Young Maids

题意

给你一个序列,然后现在你每次从里面取出两个相邻的值,然后拉出来放在答案数组前面。然后空位合拢。问最小字典序情况下的答案数组是什么。

思考历程

一开始感觉好熟悉的亚子,然后我刚推完样例就知道了。
我™做过。

题解

我们发现,原题可以转化成给他打括号。
然后括号匹配起来就好了。

于是我们就可以用贪心的方法,分别维护奇数位和偶数位的最小值。
然后我们就可以每次找到两个当前最优位置(一定要保证左右两边空格数为合法的),然后递归左边,中间,右边分别取找。
每个位置只会走一次,而且最多只有n/2层,O(n log n)O(n\ log\ n)绰绰有余,其实打rmq可以做到O(n)O(n)

没打代码,但是这个思路很妙,写一下思路提醒一下自己吧。