【hihoCoder 1819 --- 栈的加强版】
题目来源:点击进入【hihoCoder 1819 — 栈的加强版】
Description
请你实现一个加强版的栈,支持以下操作:
push x: 向栈顶加入一个整数x
pop: 从栈顶弹出一个整数,并且输出该整数
inc k x: 将处于栈底的前k个整数加x。
Input
第一行包含一个整数N,代表操作的数量。
以下N行每行一条操作。
1 ≤ N ≤ 200000, 0 ≤ x ≤ 100000, 1 ≤ k ≤ 当前栈的大小
Output
对于每一个pop操作,输出弹出的整数数值。
Sample Input
6
push 1
inc 1 2
push 2
inc 2 2
pop
pop
Sample Output
4
5
解题思路
C/C++直接暴力是过不了的,但是java直接暴力好像能过,只能归功于java的两倍时间。
如果不暴力的话我们可以根据栈的特点:先进后出。设置一个add数组标记第i位加强多少,每次输出一个就将add[i]标记到add[i-1]然后将add[i]=0;这样我们输出时只需将第i位和add[i]之和输出即可。
AC代码(C++):
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <map>
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define endl '\n'
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int MAXN = 200005;
const int MOD = 1e9+7;
int arr[MAXN],add[MAXN];
int main(){
SIS;
int n,top=0,x,y;
string s;
cin >> n;
while(n--){
cin >> s;
if(s=="push"){
cin >> x;
arr[++top]=x;
}else if(s=="pop"){
add[top-1]+=add[top];
cout << arr[top]+add[top] << endl;
add[top]=0;
top--;
}else{
cin >> x >> y;
add[x]+=y;
}
}
return 0;
}