题意:给你一个固定长度的LRU数组,每次有两种操作
0号操作:若查询的字符串已加入到数组中,就把它取出来,原有值保持不变,压入数组末尾。否则直接加入到末尾,值为输入的v。
1号操作:先得出输入的字符串在数组中的下标k,查询下标为(k+v)的数组元素的值,若k或(k+v)不存在都输出Invalid。

读懂题意后就可以开始模拟啦!
时间限制比较死,加了快读才过的。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <unordered_map>
#include <list>
#include <utility>
#include <set>
#include <bitset>
#include <random>

#define mst(a,b) memset(a,b,sizeof(a))
#define scd(x) scanf("%d", &x)
#define scdd(x,y) scanf("%d%d", &x, &y)
#define scddd(x,y,z) scanf("%d%d%d", &x, &y, &z)
#define eb emplace_back

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const double pi = 2*acos(0.0);
const double eps = 1e-6;
const ll mod = 1e9+7;
const int N = 2e5 + 10;
const int M = 1000 + 10;

namespace IO {
    const int maxn=14096;
    char buf[maxn], t[50];
    int bn=maxn, bi=maxn;
    int read(char* s) {
        while (bn) {
            for (; bi<bn && buf[bi]<=' '; bi++);
            if (bi<bn) break;
            bn=fread(buf, 1, maxn, stdin);
            bi=0;
        }
        int sn=0;
        while (bn) {
            for (; bi<bn && buf[bi]>' '; bi++) s[sn++]=buf[bi];
            if (bi<bn) break;
            bn=fread(buf, 1, maxn, stdin);
            bi=0;
        }
        s[sn]=0;
        return sn;
    }
    bool read(int& x) {
        if (!read(t)) return 0;
        x=atoi(t);
        return 1;
    }
}

struct node{
    string s;
    int v;
    node(string s, int v):s(s), v(v){}
};

unordered_map <string, list<node>::iterator> mp;
list <node> lst;
char str[50];

void solve(){
    int T;
    IO::read(T);
    while(T--){
        mp.clear(); lst.clear();
        int q, m;
        IO::read(q); IO::read(m);
        while(q--){
            int op, v;
            string s;
            IO::read(op); IO::read(str); IO::read(v);
            s = string(str);
            if(op == 0){
                if(mp.find(s)!=mp.end()){
                    auto it = mp[s];
                    v = it->v;
                    lst.erase(it);
                }
                lst.eb(node(s, v));
                mp[s] = prev(lst.end());
                printf("%d\n", v);
                if(lst.size() > m){
                    mp.erase((lst.begin())->s);
                    lst.pop_front();
                }
            }
            else{
                if(mp.find(s)==mp.end()) puts("Invalid");
                else{
                    auto it = mp[s];
                    if(v==-1){
                        if(it==lst.begin()) puts("Invalid");
                        else{
                            it = prev(it);
                            printf("%d\n", it->v);
                        }
                    }
                    else if(v==1){
                        if(next(it)==lst.end()) puts("Invalid");
                        else{
                            it = next(it);
                            printf("%d\n", it->v);
                        }
                    }
                    else printf("%d\n", it->v);
                }
            }
        }
    }
}

int main()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
    //freopen("ans.txt","w",stdout);
#endif
    //std::ios::sync_with_stdio(false);
    //cin.tie(0); cout.tie(0);

    solve();  return 0;
}