题目




思路
emmmm。
主要两种操作,插入,删除。
第一想法STL暴力。
很简单想到map,虽然比较暴力。
据说map可能超时,所以我们使用unordered_map。
模拟起来比较繁琐。
代码
#include <bits/stdc++.h>
using namespace std;
int n, m;
struct node {
int v;
string m;
}; list<node>l;
map<string, list<node>::iterator >h;
int main() {
int T; cin >> T;
while (T--) {
l.clear(); h.clear();
scanf("%d%dd", &n, &m);
int siz = 0;
for (int i = 0; i < n; i++) {
int a, b; string c;
node it;
cin >> a >> c >> b;
if (a == 0) {
if (h.count(c)) {
it = *h[c];
l.erase(h[c]);
l.push_back(it);
h[c] = --l.end();
printf("%d\n", it.v);
}
else {
node tmp = (node){b, c};
l.push_back(tmp);
h[c] = --l.end();
siz++;
printf("%d\n", b);
}
if (siz > m) {
h.erase(l.begin()->m);
l.pop_front();
siz--;
}
}
else {
if (!h.count(c)) { puts("Invalid"); continue; }
list<node>::iterator noww = h[c];
if (b == 0) printf("%d\n", noww->v);
else if (b == 1)
if (noww != --l.end()) printf("%d\n", (++noww)->v);
else puts("Invalid");
else
if (noww != l.begin()) printf("%d\n", (--noww)->v);
else puts("Invalid");
}
}
}
return 0;
}