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;
}