本题是 洛谷 - P1750 出栈序列 的加强版。
#题面
#题目背景
90 岁的张哥哥躺在床上,奄奄一息,No enemy 和小叶子在两旁伺候。
ck 赶来:「lzl 块状链表调不出来,你去帮他 debug 吧。」
张哥哥:「老了,让这蒟蒻自己去调。」
风雪山神猫的林教头的林妹妹赶来(好像有什么不和谐的东西乱入了):「后宫『着火了』又!」
张哥哥:「老了,没力气了,我相信你能搞定的。」
这时,张哥哥的手机铃声「星空使者」响起,电话那头是镕昊和克凡:「我们在 ACM 的现场,发现栈不会写……」话音未落,张哥哥腾得一声跳了起来,容光焕发:「什么?!栈都不会写,放着我来!」
这件事情告诉我们,栈,是张哥哥生前最喜欢的数据结构(与事实不符别怪我)。
#题目描述
我们知道,给定一个由 个元素构成的序列,将其中的元素按顺序压入一个大小为 的栈并弹出。元素按它们的出栈顺序进行排列,会得到一个新的序列。这样的序列可能会有很多种,请输出所有新序列中第一个元素最小的序列(若第一个元素最小的序列有多个,则令第二个尽可能小;若仍有多个,则令第三个最小,以此类推)。
#输入格式
第一行两个正整数 。
第二行 个整数,表示将顺序入栈的元素的值。
#输出格式
仅一行,即满足要求的序列。
#输入输出样例
样例输入 #1
3 2
5 3 2
样例输出 #1
3 2 5
样例说明 #1
因为栈的大小为 ,所以 2 3 5
尽管是最小的序列,但是是不合法的。正确的做法是先将 、 压入栈中,弹出 ,压入 ,弹出 ,弹出
#数据规模与约定
- 对于 的数据,;
- 对于 的数据,;
- 对于 的数据,,元素大小均在 以内。
#思路
#70 分
考虑贪心。
设定两个指针 ,初始值为 和 。
循环 次,每次找出 区间中未被标记的最小的数并输出、标记,然后将 跳到前一个未被标记的数, 增加 。
可以证明这个贪心是正确的。
#100 分
使用线段树维护区间最小值可以将区间最值的查询从 降至 。
使用栈模拟实际操作可以省去标记已入栈的数,需要遵循以下几点注意事项:
- 入栈时需要将当前区间内的最小值前的所有未入栈元素入栈。
- 确保栈内元素数量不超过栈容量。
- 弹出栈顶元素后从栈顶元素的后一个元素开始执行上述过程。
#代码
70 分代码
1 |
|
100 分代码
1 |
|