NOIP双栈排序

这个题一言难尽

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

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

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

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

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

posted @ 2018-08-24 11:37  saionjisekai  阅读(99)  评论(0编辑  收藏  举报