[USACO10OPEN] Time Travel S

题目描述

Farmer John 买了台时光机,这使得他可以方便地管理自己的奶牛群。

他现在有 NN 个操作(1≤N≤8×1041≤N≤8×104),每次操作仅可能是如下三种之一:

  1. a x:添加一头编号为 xx 的奶牛(1≤x≤1061≤x≤106)。
  2. s:卖掉最近添加的奶牛(保证此时至少有一头奶牛)。
  3. t x:回到第 xx 次操作前的状态(保证第 xx 次操作存在)。

你需要在 FJ 执行每次操作后输出他拥有的最新的奶牛的编号。特别地,如果没有奶牛,输出 −1−1。

输入格式

第一行一个整数 NN。

接下来 NN 行,每行描述一次操作。

输出格式

第 ii 行输出第 ii 次操作后 FJ 拥有的最新的奶牛的编号。特别地,如果没有奶牛,输出 −1−1。

样例 #1

样例输入 #1

12
a 5
a 3
a 7
s
t 2
a 2
t 4
a 4
s
t 7
s
s

Copy

样例输出 #1

5
3
7
3
5
2
7
4
7
2
5
-1

Copy

提示

下面是样例解释,其中拥有的奶牛已经按添加顺序排好。

操作编号操作拥有的奶牛输出
1a 55
2a 35,33
3a 75,3,77
4s5,33
5t 25
6a 25,22
7t 45,3,77
8a 45,3,7,44
9s5,3,77
10t 75,22
11s5
12/-1

#include<bits/stdc++.h>
using namespace std;
int f[80001][801],f2[80010],t,n=0,m,n2,fn[80001];
char ch;
int main(){
    ios::sync_with_stdio (false); 
    cin>>t;
    f2[0]=-1;
    f[0][0]=-1;
    for(int i=1;i<=t;i++){
        f[i][0]=-1;
        cin>>ch;
        if(ch=='a'){
            cin>>m;
            f2[++n]=m;
        }
        else if(ch=='s'){
            //if(n>=1){
                f2[n]=0;
                n--;
            //}        
        }
        else if(ch=='t'){
            cin>>m;
            for(int j=0;j<=fn[m-1];j++){
                f2[j]=f[m-1][j];
            }
            n=fn[m-1];        
        }
        n2++;
        cout<<f2[n]<<"\n";
        for(int j=0;j<=n;j++){
            f[n2][j]=f2[j];
        //    cout<<f2[j]<<" ";
        }
        //cout<<"\n";
        fn[n2]=n;
    }

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值