您的位置:首页 > 其它

有趣的堆栈

2017-10-17 01:57 113 查看
大家都熟悉堆栈操作。一个堆栈一般有两种操作,push和pop。假设所有操作都是合法的并且最终堆栈为空。我们可以有很多方法记录堆栈的操作,
(1) 对每个pop操作,我们记录它之前一共有多少个push操作。
(2) 对每个pop操作,我们记录这个被Pop的元素曾经被压上了几个。
例如:操作push, push, pop, push, push, pop, push, pop, pop, pop
用第一种方法 记录为 2, 4, 5, 5, 5
用第二种方法 记录为 0, 0, 0, 2, 4
这两种记录方法可以互相转化,我们的问题是,给定第二种记录方法的序列,请求出第一种记录方法的序列。

Input
第一行一个整数n,表示序列的长度(0 < n <=1000000)
第二行n个整数,表示第二种方法的记录。

Output
一行,空格分隔的n个整数,表示第一种表示方法的序列。

Input示例
5
0 0 0 2 4

Output示例
2 4 5 5 5
#include <stdio.h>

int buf[1000001];
int input[1000001];

int main()
{
int n;
scanf("%d", &n);

for (int i = 0; i < n; i++)
{
scanf("%d", &input[i]);
if (input[i] == 0)
{
buf[i] = 1;
}
else
{
buf[i] = 0;
buf[i - input[i]]++;
}
}

int result = 0;
for (int i = 0; i < n; i++)
{
result += buf[i];
//cout << result << " ";
printf("%d ", result);
}
printf("\n");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: