记录编号 353120 评测结果 AAAAAAAAAAAAAAA
题目名称 [NOIP 2008]双栈排序 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 0.025 s
提交时间 2016-11-17 20:36:22 内存使用 3.93 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<stack>
  6. using namespace std;
  7. const int N=1010;
  8. int n,a[N],go[N][N],cnt[N];
  9. int color[N];
  10. void paint(int x,bool c){
  11. if (color[x]==-1){
  12. color[x]=c;
  13. for (int i=1;i<=cnt[x];i++) paint(go[x][i],!c);
  14. }
  15. else if (color[x]!=c)
  16. puts("0"),exit(0);
  17. }
  18. vector<int> ans;
  19. stack<int> S[2];
  20. void getin(int x){
  21. static int pos=1;
  22. bool check=1;
  23. vector<int> vec;
  24. while (check){
  25. check=0;
  26. if (!S[0].empty()&&S[0].top()==pos){
  27. S[0].pop();pos++;check=1;
  28. vec.push_back('b');
  29. }
  30. if (!S[1].empty()&&S[1].top()==pos){
  31. S[1].pop();pos++;check=1;
  32. vec.push_back('d');
  33. }
  34. }
  35. if (x+1<n&&!color[x+1]){
  36. for (int i=vec.size()-1;i>=0;i--)
  37. if (vec[i]=='b'){
  38. int len=(int)vec.size()-i-1;
  39. for (int k=pos-1;k>pos-1-len;k--)
  40. S[1].push(k);
  41. pos-=len;
  42. vec.resize((int)vec.size()-len);
  43. break;
  44. }
  45. }
  46. ans.insert(ans.end(),vec.begin(),vec.end());
  47. }
  48. int main()
  49. {
  50. freopen("twostack.in","r",stdin);
  51. freopen("twostack.out","w",stdout);
  52. scanf("%d",&n);
  53. for (int i=1;i<=n;i++) scanf("%d",&a[i]);
  54. int Min=1e9;
  55. for (int j=n;j;j--){
  56. for (int i=1;i<j;i++)
  57. if (a[i]<a[j]&&Min<a[i])
  58. go[i][++cnt[i]]=j,go[j][++cnt[j]]=i;
  59. Min=min(Min,a[j]);
  60. }
  61. for (int i=1;i<=n;i++) color[i]=-1;
  62. for (int i=1;i<=n;i++)
  63. if (color[i]==-1) paint(i,0);
  64. S[0].push(0);S[1].push(0);
  65. for (int id=1;id<=n;id++){
  66. if (!color[id]){
  67. S[0].push(a[id]);
  68. ans.push_back('a');
  69. getin(a[id]);
  70. }else
  71. if (color[id]){
  72. S[1].push(a[id]);
  73. ans.push_back('c');
  74. getin(a[id]);
  75. }
  76. }
  77. for (int i=0;i<(int)ans.size();i++)
  78. printf("%c ",ans[i]);
  79. puts("");
  80. return 0;
  81. }