博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP双栈排序
阅读量:7124 次
发布时间:2019-06-28

本文共 724 字,大约阅读时间需要 2 分钟。

这个题一言难尽

栈中的数字显然应该是递减的,但是这道题的难点在于如何判断两个数是否应该放在不同的栈里面。

显然我们应该化繁为简,不得不放在两个栈的另一个含义就是不能放在一个栈里面

那么什么情况一定不能放在一个栈里面,有一个定理:

考虑对于任意两个数q[i]和q[j],它们不能压入同一个栈中的充要条件: 存在一个k,使得i<j<k且q[k]<q[i]<q[j]。

为什么是正确的,因为对于一个栈,如果无论怎么放都会存在小的数在大的前面那么就不行

那么在这里由于q[k]是最小的,那么显然应放到它了再把它弹出来,那么前面的数很显然应该全部进去

那么显然就得证了

那么这道题避免这种情况的方法就是把这两个数放在不同的栈里来错开

那么又该怎么办????

如果有互斥或者依存关系的情况可以考虑连边

那么连边之后又该怎么办?

如果有三个元素两两不能在一个栈里面,那么问题就是无解的,简单来说就是必须两两互斥

那么互斥的话就构成了二分图的01性质

问题就很显然,判定二分图就可以了

顺手粘一个二分图判断板子

1 int dfs(int x,int c){2     co[x]=c;3     for(int i=first[x];i;i=nxt[i]){4         int v=e[i].v;5         if(co[v]==co[x])return 0;6         if(!co[v])return dfs(v,c^1);7     }8     return 1;9 }

至于最后的方案打印就模拟出栈就可以了,注意字典序

转载于:https://www.cnblogs.com/saionjisekai/p/9528857.html

你可能感兴趣的文章
用Java实现生产者和消费者的多线程例子
查看>>
alter database datafile offline drop 与 alter tablespace drop datafile 区别 .
查看>>
Java学习课程体系
查看>>
我的友情链接
查看>>
Python install 问题汇总
查看>>
我的友情链接
查看>>
JavaScript中的一些特殊用法(六)
查看>>
saltstack的安装及配置
查看>>
SCVMM 2012 SP1 安装与配置指南(四)配置SMI-S提供程序来添加iSCSI存储
查看>>
Spring 的优秀工具类
查看>>
MySQL源码编译安装(CentOS-6.6+MySQL-5.6)
查看>>
CentOS 7 基于fastcgi 的lamp
查看>>
linux大神必备技能
查看>>
C语言:不使用(a+b)/2这种方式(会溢出),求两个数的平均值
查看>>
2.Python安装
查看>>
HttpUrlConnection Get 和Post请求
查看>>
split命令
查看>>
apache配置默认虚拟主机
查看>>
CSS3实现的图片加载动画效果
查看>>
Navitcat连接远程mysql服务器连不上
查看>>