P6182 [USACO10OPEN]Time Travel S.
正解
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
//#define double long long
#define re register int
//#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int mod= 998244353;
//const int inf=1e18;
const int M=1e8;
const int N=2e7+5;//??????.???? 4e8
struct tre
{
int l,r,sum;
}e[N];
int tot,n;
int t[N],rt[N];
void insert(int &p,int pre,int l,int r,int pos,int d)
{
e[++tot]=e[pre];
p=tot;
if(l==r)
{
e[p].sum=d;
return;
}
int mid=(l+r)>>1;
if(pos<=mid) insert(e[p].l,e[pre].l,l,mid,pos,d);
else insert(e[p].r,e[pre].r,mid+1,r,pos,d);
}
int ask(int p,int l,int r,int pos)
{
if(l==r) return e[p].sum;
int mid=(l+r)>>1;
if(pos<=mid) return ask(e[p].l,l,mid,pos);
else return ask(e[p].r,mid+1,r,pos);
}
void solve()
{
cin>>n;
for(re i=1;i<=n;i++)
{
char op[5];
int x;
scanf("%s",op);
if(op[0]=='a')
{
scanf("%lld",&x);
t[i]=t[i-1]+1;
insert(rt[i],rt[i-1],1,n,t[i],x);
}
if(op[0]=='s')
{
t[i]=t[i-1];
insert(rt[i],rt[i-1],1,n,t[i],0);
t[i]--;
}
if(op[0]=='t')
{
scanf("%lld",&x);
rt[i]=rt[x-1];
t[i]=t[x-1];
}
printf("%lld\n",t[i]==0?-1:ask(rt[i],1,n,t[i]));
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
/*
*/
巧解
#include <bits/stdc++.h>
#define inf 0x7fffffff
#define ll long long
#define int long long
//#define double long double
//#define double long long
#define re register int
//#define void inline void
#define eps 1e-8
//#define mod 1e9+7
#define ls(p) p<<1
#define rs(p) p<<1|1
#define pi acos(-1.0)
#define pb push_back
#define mk make_pair
#define P pair < int , int >
using namespace std;
const int mod= 998244353;
//const int inf=1e18;
const int M=1e8;
const int N=2e7+5;//??????.???? 4e8
int t[N],n,pre[N],a[N],top;
void solve()
{
cin>>n;
for(re i=1;i<=n;i++)
{
int x;
char op[5];
scanf("%s",op);
if(op[0]=='a')
{
scanf("%lld",&x);
a[++top]=x;
t[i]=top;
pre[t[i]]=t[i-1];
}
if(op[0]=='s') t[i]=pre[t[i-1]];
if(op[0]=='t')
{
scanf("%lld",&x);
t[i]=t[x-1];
}
printf("%lld\n",t[i]==0?-1:a[t[i]]);
}
}
signed main()
{
int T=1;
// cin>>T;
for(int index=1;index<=T;index++)
{
solve();
// puts("");
}
return 0;
}
/*
*/