NOIP双栈排序

本文探讨了在栈中放置递减数字的问题,提出了一个关键定理:两个数不能放在同一栈中的条件,并通过构建二分图进行解决。文章详细解释了算法原理,包括如何判定两个数是否应放在不同栈,以及如何通过二分图判定解决三元素两两不能共栈的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题一言难尽

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

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

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

考虑对于任意两个数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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值