【51nod1403】 有趣的堆栈

32 篇文章 0 订阅
18 篇文章 0 订阅

Description

大家都熟悉堆栈操作。一个堆栈一般有两种操作,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
这两种记录方法可以互相转化,我们的问题是,给定第二种记录方法的序列,请求出第一种记录方法的序列。

Solution

我们考虑第二种序列的第i个值x代表的含义。他指的是当前第i个数push和pop之间有多少个push和pop。那么对这之间的x+1个数(包括i)的pop,当前i的push都是有影响的,所以只要在i-x处+1。最后输出一下前缀和就好了。

Code

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e6+5; 
int a[maxn],n,i,t,j,k,l,x,b[maxn];
int dg(){
    int x=0;char ch=getchar();
    while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar();
    return x;
}
void dg1(int x){
    if (x<=9){
        putchar(x+'0');return;
    }
    dg1(x/10);putchar(x%10+'0');
}
int main(){
    scanf("%d\n",&n);
    for (i=1;i<=n;i++)
        x=dg(),a[i-x]++;
    for (i=1;i<=n;i++)
        a[i]+=a[i-1],dg1(a[i]),putchar(' ');
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值