Time Limit: 1 second

Memory Limit: 50 MB

【问题描述】

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

【输入】

  1. 2行。第一行是一个整数n
  2. 第二行有n个用空格隔开的正整数,构成一个1~n的排列。

【输出】

  1. 共一行,如果输入的排列不是“可双栈排序排列”,输出数字0;否则输出字典序最小的操作序列,每两个操作之间用空格隔开,行尾没有空格。

【输入样例1】

  1. 4
  2. 1 3 2 4

【输出样例1】

  1. a b a a b b a b

【输入样例2】

  1. 4
  2. 2 3 4 1

【输出样例2】

  1. 0

【输入样例3】

  1. 3
  2. 2 3 1

【输出样例3】

  1. a c a b b d

【 限制】

  1. 30%的数据满足: n<=10
  2. 50%的数据满足: n<=50
  3. 100%的数据满足: n<=1000

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=b804

【题意】



给你两个栈;

让你利用这两个栈,将所给无序排列顺序输出;

【题解】



什么时候要用到两个栈呢?

可以用1 2 3来理解;

1 2 3则只要一个栈就够了,每次进去之后直接输出

1 3 2第一个进去直接出来,第2个,第3个都压进同一个栈里面,然后按照栈规则顺序弹出

2 1 3第一个和第二个都压进去然后顺序弹出,然后再把3压进去再弹出

2 3 1可以尝试一下,怎么搞都没办法用一个栈实现;

3 1 2和3 2 1都能用一个栈搞;

所以只有

2 3 1这种情况不能用一个栈搞;

但是如果2和3放在两个栈里面就能搞了;

根据这个规则即

如果i< j< k

且存在a[k]< a[i]< a[j];

则i和j要放在不同栈里面;

其他情况都能用一个栈搞定;

写个二分图染色;

如果可以染色就表示可以;

不能染色直接输出0;

优先把数字染色为1,其次染色为2;

然后对于颜色为1的,进第一个栈,颜色为2的进第二个栈;

每次看看该进相应栈的栈顶元素是不是比当前元素大,如果是就进栈;

否则出栈就好;

模拟一下就好;



【完整代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <stack>
  5. #include <string>
  6. using namespace std;
  7. #define lson l,m,rt<<1
  8. #define rson m+1,r,rt<<1|1
  9. #define LL long long
  10. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  11. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  12. #define mp make_pair
  13. #define pb push_back
  14. #define fi first
  15. #define se second
  16. #define rei(x) scanf("%d",&x)
  17. #define rel(x) scanf("%I64d",&x)
  18. typedef pair<int,int> pii;
  19. typedef pair<LL,LL> pll;
  20. const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
  21. const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
  22. const double pi = acos(-1.0);
  23. const int MAXN = 1e3+100;
  24. struct abc
  25. {
  26. int en,nex,w;
  27. };
  28. abc bian[MAXN*MAXN*2];
  29. int n,a[MAXN],mi[MAXN],tot,fir[MAXN],col[MAXN];
  30. string ans = "";
  31. stack <int> sta[3];
  32. void add(int x,int y)
  33. {
  34. bian[++tot].nex = fir[x];
  35. fir[x] = tot;
  36. bian[tot].en = y;
  37. }
  38. void dfs(int x,int c)
  39. {
  40. if (!col[x])
  41. col[x] = c;
  42. else
  43. if (col[x]!=c)
  44. {
  45. puts("0");
  46. exit(0);
  47. }
  48. else
  49. return;
  50. for (int i = fir[x];i;i = bian[i].nex)
  51. dfs(bian[i].en,3-c);
  52. }
  53. int main()
  54. {
  55. //freopen("F:\\rush.txt","r",stdin);
  56. rei(n);
  57. rep1(i,1,n) rei(a[i]);
  58. mi[n]=a[n];
  59. rep2(i,n-1,1)
  60. mi[i] = min(mi[i+1],a[i]);
  61. rep1(i,1,n-2)
  62. rep1(j,i+1,n-1)
  63. if (mi[j+1]<a[i] && a[i]<a[j])
  64. add(i,j),add(j,i);
  65. rep1(i,1,n)
  66. if (!col[i])
  67. dfs(i,1);
  68. int sr = 1,sc = 1;
  69. while (true)
  70. {
  71. if (sc>n) break;
  72. if (col[sr] == 1 && (sta[1].empty()||sta[1].top()>a[sr]))
  73. {
  74. sta[1].push(a[sr]);
  75. sr++;
  76. ans+='a';
  77. continue;
  78. }
  79. if (!sta[1].empty() && sta[1].top()==sc)
  80. {
  81. sta[1].pop();
  82. ans+='b';
  83. sc++;
  84. continue;
  85. }
  86. if (col[sr] == 2 && (sta[2].empty()||sta[2].top()>a[sr]))
  87. {
  88. sta[2].push(a[sr]);
  89. sr++;
  90. ans+='c';
  91. continue;
  92. }
  93. if (!sta[2].empty() && sta[2].top()==sc)
  94. {
  95. sta[2].pop();
  96. ans+='d';
  97. sc++;
  98. continue;
  99. }
  100. }
  101. int len = ans.size();
  102. rep1(i,0,len-1)
  103. {
  104. putchar(ans[i]);
  105. if (i==len-1)
  106. puts("");
  107. else
  108. putchar(' ');
  109. }
  110. return 0;
  111. }

【b804】双栈排序的更多相关文章

  1. NOIP2008双栈排序[二分图染色|栈|DP]

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  2. noip2008 双栈排序

    题目描述 Description \(Tom\)最近在研究一个有趣的排序问题.如图所示,通过\(2\)个栈\(S_1\)和\(S_2\),\(Tom\)希望借助以下\(4\)种操作实现将输入序列升序排 ...

  3. BZOJ 2080: [Poi2010]Railway 双栈排序

    2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Statu ...

  4. 双栈排序(codevs 1170)

    题目描述 Description Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈 ...

  5. #include <NOIP2008 Junior> 双栈排序 ——using namespace wxl;

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  6. [NOIP2008] 提高组 洛谷P1155 双栈排序

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  7. 【NOIP2008】双栈排序

    感觉看了题解还是挺简单的,不知道当年chty同学为什么被卡了呢么久--所以说我还是看题解了 原题: Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将 ...

  8. 双栈排序(codevs 1170)题解

    [问题描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...

  9. Noip2008双栈排序

    [问题描述] 用两个栈使一个1...n的排列变得有序.一共有四个操作: A.stack1.push() 读入一个放入栈一 B.stack1.pop() 弹出栈一放入输出序列 C.stack2.push ...

随机推荐

  1. input的表单验证(不断更新中~~)

    1 手机号验证 <input type="tel" id="phone" name="phone" placeholder=" ...

  2. Linux的登录和退出

    Linux是一个多用户的操作系统,用户要使用该系统,首先必须登录系统,使用完系统后,必须退出系统. 本章主要讨论登录和退出系统的方法: 用户登录系统时,为了使系统能够识别自己,必须输入用户名和密码,经 ...

  3. java读取项目路径下的中文文件乱码问题

    出现乱码错误: 处理方案: 对文件路径中存在中文的,都要进行URLDecoder.decode(path,"UTF-8")编码转换 wordContent = URLEncoder ...

  4. 【itsdangerous】的加密解密原理(易懂版)

    from itsdangerous import TimedJSONWebSignatureSerializer import time from itsdangerous import Signat ...

  5. Directx11教程40 纹理映射(10)

    原文:Directx11教程40 纹理映射(10)      本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如 ...

  6. 纯CSS3绘制的黑色图标按钮组合

    在线演示 本地下载

  7. linux 查看并关闭窗口

    查看端口 ps -ef | grep tomcat 关闭端口 kill -9 端口号

  8. bzoj4033 树上染色

    Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距 ...

  9. node.js(连接mysql)

    mysql语句中的SQL sql语句中的分类: ---DDL:(data define language)定义数据列(create,drop,alter,truncate) ---DML:(data ...

  10. markdown-it + highlight.js简易实现

    markdown-it 官方demo markdown-it 文档 1.配置highlightjs,针对markdown中各种语言高亮,针对对应的标签 pre code 里面的样式 -- index. ...