限制
1 ≤ n ≤ 1,600,000
0 ≤ m ≤ 1,600,000
时间:2 sec
空间:256 MB
解题思路:
1、先将序列扫描到一个数组num。从1-n挨个进栈,如果进栈数i == num[j],i出栈。
2、i出栈以后,判断下一个数num[j++],这时要先判断stack[top]是否等于它。如果相等,栈顶值出线,j++,再判stack[top]是否等于num[j++] ……。
具体代码如下:
#include
//#include
#define N 1600001
int stack[N];
int num[N-1];
int out[2 * N];// 1-push;0-pop
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d", &num[i]);
int flag = 1;// 1-可行;0-no
int k = 0;// out的下标
int top = 0;// stack的下标
for (int i = 1,j = 0; i <= n && j < n; i++)
{
if (top < m) {
out[k++] = 1;
stack[top++] = i;
} else {
flag = 0;
break;
}
if (i == num[j]) {
j++;
stack[--top] = 0;
out[k++] = 0;
while (top > 0 && stack[top - 1] == num[j]) {
j++;
stack[--top] = 0;
out[k++] = 0;
}
}
}
if (flag == 0 || top != 0) printf("No\n");
else
{
for (k = 0; k < 2 * n; k++)
{
if (out[k] == 0) printf("pop\n");
else if (out[k] == 1) printf("push\n");
}
}
//system("pause");
return 0;
}