fork(1) download
  1. #include<cstdio>
  2.  
  3. class stack{
  4. private:
  5. int data[100001];
  6. int cnt, ansCnt;
  7. bool ansFalse;
  8. char ans[200000];
  9. public:
  10. stack(){
  11. cnt = 0;
  12. ansCnt = 0;
  13. bool ansFalse = true;
  14. }
  15. void push(int i){
  16. data[cnt++] = i;
  17. ans[ansCnt++] = '+';
  18. }
  19. int pop(){
  20. if(!empty()){
  21. ans[ansCnt++] = '-';
  22. //printf("%d ",data[cnt-1]);
  23. return data[--cnt];
  24. }else{
  25. ansFalse = false;
  26. }
  27. }
  28. bool empty(){
  29. if(cnt==0) return true;
  30. return false;
  31. }
  32. bool getAnsFalse(){
  33. return ansFalse;
  34. }
  35. int getAnsCnt(){
  36. return ansCnt;
  37. }
  38. char getAns(int i){
  39. return ans[i];
  40. }
  41. void setAnsFalse(bool i){
  42. ansFalse = i;
  43. }
  44. };
  45.  
  46. int main(){
  47. stack s;
  48.  
  49. int t, cnt = 0, num = 1;
  50. int input[100000] = {0};
  51. scanf("%d", &t);
  52.  
  53. for(int i = 0 ; i < t ; i++){
  54. scanf("%d",&input[i]);
  55. } // input data
  56.  
  57. while(true){
  58. if(cnt == t){ // 입력한 갯수와 테스트의 크기가 같다면 종료
  59. break;
  60. }// end
  61.  
  62. if(input[cnt] == num){ // 입력받은 인덱스에 위치한 값과, num가 같다면
  63.  
  64. s.push(num++); // 넣고
  65. s.pop(); // 꺼냄
  66. cnt++; // 다음 인덱스로
  67.  
  68. }else if(input[cnt] < num){ // 입력받은 인덱스에 위치한 값보다 num이 더 크다면, 꺼내기
  69.  
  70. int temp = s.pop(); // 꺼냄
  71. if(temp != input[cnt]){ // 꺼낸 값이 입력받은 인덱스에 위치한 값과 같지 않다면
  72. s.setAnsFalse(false); // NO를 출력하기위해 false 값 설정
  73. break; // end
  74. }
  75. cnt++; // 맞는 경우라면 다음 인덱스 값 진행
  76.  
  77. }else{ // 입력받은 인덱스에 위치한 값보다 작다면 그대로 푸쉬
  78.  
  79. s.push(num++); // 푸쉬
  80. }
  81. }
  82.  
  83. if(s.getAnsFalse()){
  84. int temp = s.getAnsCnt();
  85. for(int i = 0 ; i < temp ; i++){
  86. printf("%c\n",s.getAns(i));
  87. }
  88. }else{
  89. printf("NO\n");
  90. }
  91. return 0;
  92. }
Success #stdin #stdout 0s 3600KB
stdin
8
1
2
3
4
5
6
7
8
stdout
NO