【usaco 2010 Open】 Time Travel 时间旅行

Description

约翰得到了一台时光机,他可以用这台机器回到过去(但不能到未来),改变他家的牛群。约翰 打算依次进行 N 步操作,每步操作分为三种:

• 买入操作以 a 表示,后接一个参数 i,表示约翰新买了一头编号为 i 的奶牛,将其放入牛棚

• 卖出操作以 s 表示,表示约翰会将牛棚中最近买入的一头奶牛卖掉

• 时光倒流的操作以 t 表示,后接一个参数 k,表示约翰将发动时光机,牛棚将返回到第 k 步操 作之前的状态

请帮助约翰记录牛棚里的奶牛信息,每当执行完一步操作后,输出目前在牛棚里的最近买入的奶牛, 如果当时牛棚里没有奶牛了,输出 −1。

真是道神奇的题 以至于可以交的地方不多 这里给你们. 叫我雷锋~   SPOJ  TJU

如果你很厉害 那你打可持久化线段树就好了抓狂

然而这题是神奇的链表!

我们设c[i]为i位置最近买的牛 f[i]表示上一个状态是哪个位置

对于三个操作 买:c[i]=x f[i]=i-1

                       卖:c[i]=c[ f[i-1] ] f[i]=f[ f[i-1] ]

                       跳:c[i]=c[k-1]  f[i]=f[k-1]

建议扫一眼之后自己推一下 强大的链表23333

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=80002,inf=1e9;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}
int f[N],c[N];
int main()
{
        int i,x,n=read(); char ch;
        for(i=1;i<=n;i++)
        {
                scanf("\n%c",&ch);
                if(ch=='s')c[i]=c[f[i-1]],f[i]=f[f[i-1]];
                else
                {
                        x=read();
                        if(ch=='t')f[i]=f[x-1],c[i]=c[x-1];
                        else f[i]=i-1,c[i]=x;
                }
                if(c[i])printf("%d\n",c[i]);
                else printf("-1\n");
        }
        return 0;
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值