JZOJ2530(/1812[初中])双栈排序

题目描述

Tom最近在研究一个有趣的排序问题。如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序。
操作a
如果输入序列不为空,将第一个元素压入栈S1
操作b
如果栈S1不为空,将S1栈顶元素弹出至输出序列
操作c
如果输入序列不为空,将第一个元素压入栈S2
操作d
如果栈S2不为空,将S2栈顶元素弹出至输出序列
如果一个1~n的排列P可以通过一系列操作使得输出序列为1,2,…,(n-1),n,Tom就称P是一个“可双栈排序排列”。例如(1,3,2,4)就是一个“可双栈排序序列”,而(2,3,4,1)不是。
当然,这样的操作序列有可能有几个,对于上例(1,3,2,4),是另外一个可行的操作序列。Tom希望知道其中字典序最小的操作序列是什么。


这道题要用到玄学之二分图染色

首先,弄一个后缀和,h[i]表示第i个数后面的数中最小的数(包括第i个),

接着i从1枚举到n,

如果

b[j]=0

如果b[i]=0则b[i]=1,b[j]=2,然后给b[i]与b[j]连一条边,

如果b[i]<>0则b[j]=3-b[i],然后给b[i]与b[j]连一条边,

b[j]<>0

如果b[i]=0则b[i]=3-b[j],然后给b[i]与b[j]连一条边,

如果b[i]<>0则b[j]=3-b[i],然后给b[i]与b[j]连一条边,

然后用一个过程判断一下是否存在一个点k与点j相连,且b[j]=b[k],

用一个ans来存下一个应该出栈的数的数值

用一个k来存下一个应该入栈的数的数值

s1表示栈1

s2表示栈2

while ans<=n 

如果i<=n

如果b[i]=1且(a[i]<s1栈顶或s1没数),就把a[i]入栈,inc(i),输出'a '

如果s1栈顶=ans,就把s1栈顶出栈,输出'b ’,inc(ans)

如果b[i]=2且(a[i]<s2栈顶或s2没数),就把a[i]入栈,inc(i),输出'c '

如果s2栈顶=ans,就把s2栈顶出栈,输出'd ’,inc(ans)

如果i>n

判断s1栈顶和s2栈顶哪个可以出栈

然后输出'b '或‘d '

就这样了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值