有趣的堆栈

大家都熟悉堆栈操作。一个堆栈一般有两种操作,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<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define Max 1000010
int a[Max];
int c[Max];
int v[Max];
int scan()
{
    int res=0,flag=0;
    char ch;
    if((ch=getchar())==‘-‘)flag=1;
    else if(ch>=‘0‘&&ch<=‘9‘)res=ch-‘0‘;
    while((ch=getchar())>=‘0‘&&ch<=‘9‘)res=res*10+(ch-‘0‘);
    return flag?-res:res;
}
void out(int a)
{
    if(a<0){putchar(‘-‘);a=-a;
    }
    if(a>=10)out(a/10);
    putchar(a%10+‘0‘);

}
int main()
{
    int n;
    int end;
    scanf("%d",&n);
    end=n;
    for(int i=1;i<=n;i++)
    {
        a[i]=scan();
    }
    for(int i=n;i>=1;i--)
    {
        int t=end-a[i];
        c[i]=end;
        v[t]=1;
        for(;v[end]==1;)
        {
            end--;
        }
    }
    for(int i=1;i<=n;i++)
    {
       out(c[i]);putchar(‘ ‘);
    }
    return 0;
}
时间: 2024-12-20 08:12:58

有趣的堆栈的相关文章

51nod1403 有趣的堆栈

看成括号序列的话第二种方法其实就是左括号和右括号之间有多少对完整的括号. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x

1403 有趣的堆栈

1403 有趣的堆栈 基准时间限制:1 秒 空间限制:131072 KB 分值 大家都熟悉堆栈操作.一个堆栈一般有两种操作,push和pop.假设所有操作都是合法的并且最终堆栈为空.我们可以有很多方法记录堆栈的操作, (1) 对每个pop操作,我们记录它之前一共有多少个push操作. (2) 对每个pop操作,我们记录这个被Pop的元素曾经被压上了几个. 例如:操作push, push, pop, push, push, pop, push, pop, pop, pop 用第一种方法 记录为 2

51nod 1403 有趣的堆栈

题目看这里 主要是能分析出这样一个结论: 每个pop根据这个元素上面被压过多少个元素,可以知道他是在前面哪个pop之前被push的. 根据这些信息可以求得每个pop到上一个pop之间有多少个push,最后求个前缀和即可. #include <stdio.h> const int maxN=1e6+5; int N, g[maxN], h[maxN]; int main() { scanf("%d", &N); for (int i = 1; i <= N; +

谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少

开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧. 不断更新,不断更新,不断更新,重要的事情说三遍. 所有题目汇总在我的 Github . 3.层叠顺序(stacking level)与堆栈上下文(stacking context)知多少? z-index 看上去其实很简单,根据 z-index 的高低决定

构建移动Web应用程序的技术堆栈

编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重要的框架类型,其中每一个可以展开来写一篇文章.这并不是一个广泛的现有产品相比,只是一个笔者最近使用的部分技术. 虽然笔者的重点是移动优先, 笔者认为,这套技术可以应用在一般的web应用程序. 笔者的决定和数据支持考虑了几个要求: 基于JavaScript(CoffeeScript,Dart,绝对值得

C# 深入理解堆栈、堆在内存中的实现

尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序.同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为.在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作. 在.NET framework环境下,当我们的代码执行时,内存中有两个地方用来存储这些代码.假如你不曾了解,那就让我来给你介绍栈(Stack)和堆(He

转:JavaScript Promises相当酷:一种有趣的方案库

许多的语言,为了将异步模式处理得更像平常的顺序,都包含一种有趣的方案库,它们被称之为promises,deferreds,或者futures.JavaScript的promises ,可以促进关注点分离,以代替紧密耦合的接口. 本文讲的是基于Promises/A 标准的JavaScript promises.[http://wiki.commonjs.org/wiki/Promises/A]Promise的用例: 执行规则 多个远程验证 超时处理 远程数据请求 动画 将事件逻辑从应用逻辑中解耦

谈谈一些有趣的CSS题目(七)-- 消失的边界线问题

开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧. 不断更新,不断更新,不断更新,重要的事情说三遍. 谈谈一些有趣的CSS题目(一)-- 左边竖条的实现方法 谈谈一些有趣的CSS题目(二)-- 从条纹边框的实现谈盒子模型 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少 谈谈一些有趣

堆栈,堆,值类型,引用类型,装箱和拆箱

当你声明一个变量时内存中都发生了什么? 当你在一个.Net应用程序中声明一个变量时,首先要分配一些内存快到RAM,它包括三样东西,第一个是变量名,第二个是变量的数据类型,最后一个是变量的值. 这只是一个很简单的解释,根据变量的数据类型不同,有两种内存分配类型:堆栈内存和堆内存. 图 2 声明变量后的内存结构 堆栈(stack)和堆(heap) 为了帮助理解堆栈和堆,让我们了解下面的代码内部究竟发生了什么. public void Method1() { // Line 1 int i=4; //