有趣的堆栈
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
Output
Input示例
Output示例
(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; }
相关文章推荐
- 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少
- 51Nod-1403-有趣的堆栈
- 51nod 1403 有趣的堆栈
- 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少
- 51nod-1403 有趣的堆栈
- 有趣的 CSS 题目(3): 层叠顺序与堆栈上下文知多少
- 1403 有趣的堆栈
- 51nod 1403 有趣的堆栈 (找规律题)
- 1403 有趣的堆栈
- 51nod 1403 有趣的堆栈
- 【51Nod1403】有趣的堆栈
- 51nod 算法马拉松7 C.有趣的堆栈
- 有趣的堆栈
- 【51nod1403】 有趣的堆栈
- poj 3847 树(链接表与堆栈的实现)
- 辅导资料 随机算法(逆波兰表达式 堆栈 随机数)
- Recommand of the Day: 两个有趣的网站
- GCC中的堆栈编译器保护技术
- AndroidStudio(AS)的有趣、常用快捷键集合
- 有趣的sql(3)