您的位置:首页 > 其它

【51Nod1403】有趣的堆栈

2017-08-30 20:15 99 查看
大家都熟悉堆栈操作。一个堆栈一般有两种操作,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>
#include<cstring>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,sum,p[1000005],a[1000005],mx;
bool flag[1000005];
int main()
{
n=read();sum=n;
for (int i=1;i<=n;i++) a[i]=read();
for (int i=n;i;i--)
{
p[i]=sum-a[i];
flag[p[i]]=1;
while (flag[sum]) sum--;
}
for (int i=1;i<=n;i++)
{
if (p[i]>mx) mx=p[i];
printf("%d ",mx);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: