传送门
题意读懂了,感觉这就是个大模拟,但是直接模拟复杂度太大,所以我们要用链表指针搞一搞。不知道是不是我写的实在太挫,还是卡常,一直狂T,哭了。
划重点,加上这个才过。设置哈希桶大小,队友加了才过,估了,才知道这玩也,相见恨晚,还是太菜了呀。
rk.rehash(500005);
a.rehash(500005);
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define ms(_data,v) memset(_data,v,sizeof(_data))
#define sc(n) scanf("%d",&n)
#define SC(n,m) scanf("%d %d",&n,&m)
#define SZ(a) int((a).size())
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define drep(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const double pi=acos(-1.0);
const double eps=1e-9;
const int maxn=1e6+5;
int T,q,m;
struct node{
int pre,nxt;
int val;
};
unordered_map<int,node> a;
unordered_map<string,int> rk;
char alls[maxn][20];
int allop[maxn],allv[maxn];
inline int read(){
char ch = getchar(); int x = 0, f = 1;
while(ch < '0' || ch > '9') {
if(ch == '-') f = -1;
ch = getchar();
} while('0' <= ch && ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
} return x * f;
}
int main(){
T = read();
rk.rehash(500005);
a.rehash(500005);
while(T--){
q = read();
m = read();
int op,s,v,nlen=0;
int fa=-1,last;
a.clear(),rk.clear();
rep(i,1,q){
allop[i] = read();
scanf(" %s",alls[i]);
allv[i] = read();
}
int cnt=0;
rep(i,1,q){
if(rk.count(alls[i])==0) rk[alls[i]]=++cnt;
}
rep(i,1,q){
op=allop[i],s=rk[alls[i]],v=allv[i];
if(op==0){ //add
if(nlen==0){
a[fa].nxt=s;
a[s].pre=fa,a[s].val=v;
last=s,nlen++;
printf("%d\n",v);
}
else{
if(a.count(s)==0 || a[s].val==inf){ //不存在s
a[last].nxt=s,a[s].pre=last;
a[s].val=v,last=s,nlen++;
printf("%d\n",v);
if(nlen>m){ //删除头部
if(m==1){
int fato=a[fa].nxt;
a[fato].val=inf;
a[fato].pre=0,a[fato].nxt=0;
a[fa].nxt=s,a[s].pre=fa;
last=s;
}
else{
int fato=a[fa].nxt;
a[fato].val=inf;
int to=a[fato].nxt;
a[to].pre=fa,a[fa].nxt=to;
a[fato].pre=0,a[fato].nxt=0;
}
nlen--;
}
}
else{//存在s
printf("%d\n",a[s].val);
if(s==last) continue;
int spre=a[s].pre,sto=a[s].nxt;
a[sto].pre=spre,a[spre].nxt=sto;
a[last].nxt=s;
a[s].pre=last;
last=s;
}
}
}
else{ //query
if(a.count(s)==0 || a[s].val==inf){
puts("Invalid");
}
else{
if(v==0) printf("%d\n",a[s].val);
if(v==-1){
if(a[s].pre==fa) puts("Invalid");
else printf("%d\n",a[a[s].pre].val);
}
if(v==1){
if(s==last) puts("Invalid");
else printf("%d\n",a[a[s].nxt].val);
}
}
}
}
}
return 0;
}