zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    PHP页面跳转的几种方法
    PHP网站并发测试
    04-上传文件
    01-转>linux命令
    01-CDN的好处
    05-socket.io使用
    04-soket.io使用2 -数据同步简单聊天室效果
    03-socket.io 2.3.0版本的使用-用户请求接口,实时推送给前端数据
    02-转>
    跨域-转>预解析OPTIONS请求
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9528857.html
Copyright © 2011-2022 走看看