对于合法出入栈序列,如果某个相邻位置被交换,我们可以根据对应的相反数去判断每个相邻位置是否合法。
字典 mp
的构建:
首先通过字典 mp
将每个数值的索引保存下来,索引值是从0开始的(后面需要转换为1-indexed)。这是用来帮助快速查找对应出栈数的索引。
四种情况的判断:
在游游的披萨餐厅有很多机械人偶,其中有一只负责送餐的机械人偶,会记录自己的送餐情况。
送餐情况可以看作是一个合法的出入栈序列{ai}。如果ai>0则认为元素ai入栈,即机械人偶拿到餐品;如果ai<0则认为元素ai出栈,即机械人偶放下餐品,栈初始是空的,按照序列进行出入栈操作后,栈也是空的。
注意,合法的出入栈序列中,任意的两个元素先入栈的必然会晚出栈。
不过,这名机械人偶最近有了一些"心事”,不小心把序列中某两个相邻的元素交换了一下,变成了序列 它不想被游游抛弃掉,需要你来帮它恢复一下出入栈序列。即请你给出一对相邻的元素的位置,保证根据你的指示交换后,出入栈序列合法即可。
第一行,一个正偶数n(2≤n≤105),表示送餐对于出入栈序列的长度。
第二行,共n个非零的、互不相同的整数{bi}(0<bi≤220),表示机械人偶所记录的送餐情况。
保证给定的序列存在一对相邻的元素,满足交换两个元素后,序列为合法的出入栈序列。
一行,两个空格分隔的正整数u,v,满足1≤u=v−1≤n−1,表示交换{bi} 中第u 和第v个元素后,序列即为一个合法的出入栈序列。
如果有多种解,输出任意一种即可、
输入
20
11 14 16 13 -13 -16 1 -1 6 10 7 -7 -10 5 3 -3 -5 -14 -6 -11
输出
18 19
会发现6在14之后入栈,但是6却没有在14之前出栈。按照样例输出,交换给定序列的第18和第19个元素后,整体就是一个合法的出入栈序列了。