很有意思的一道题
map + 构造链表
// Problem: 小红数组操作
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/74362/D
// Memory Limit: 524288 MB
// Time Limit: 2000 ms
// Date: 2024-02-29 20:49:07
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
#define endl '\n'
#define int int64_t
using namespace std;
void solve() {
int q; cin >> q;
unordered_map<int, pair<int, int>>mp;
//[当前, {前一个,后一个}]
int pre = -1;
for (int i = 1; i <= q; ++i) {
int op, x, y; cin >> op >> x;
if (op == 1) {
cin >> y;
if (!mp.count(x)) {
if (y == 0) {
if (pre == -1) {
//还没有数
pre = x;
mp[x] = { -1,-1 };
}
else {
//有数
mp[pre].first = x;
mp[x].first = -1;
mp[x].second = pre;
pre = x;
}
}
else {
//放在y的右边
if (mp[y].second == -1) {
//y是最后一个
mp[y].second = x;
mp[x].first = y;
mp[x].second = -1;
}
else {
//y不是最后一个
mp[mp[y].second].first = x;
mp[x].second = mp[y].second;
mp[y].second = x;
mp[x].first = y;
}
}
}
}
else {
if (mp.count(x)) {
if (mp.size() == 1) {
//最特殊的一种情况,删没了
pre = -1;
}
else {
if (mp[x].first == -1) {
//x是第一个
mp[mp[x].second].first = -1;
pre = mp[x].second;
}
else if (mp[x].second == -1) {
//x是最后一个
mp[mp[x].first].second = -1;
}
else {
mp[mp[x].first].second = mp[x].second;
mp[mp[x].second].first = mp[x].first;
}
}
mp.erase(x);
}
}
/*int pos = pre;
while (pos != -1) {
cout << pos << " ";
pos = mp[pos].second;
}
cout << endl;*/
}
/*int pos = pre;
while (pos != -1) {
cout << pos << " ";
pos = mp[pos].second;
}*/
cout << mp.size() << endl;
/*for (auto it : mp) cout << it.first << " ";
cout << endl;*/
while (pre != -1) {
cout << pre << " ";
pre = mp[pre].second;
}
cout << endl;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t = 1;
while (t--) {
solve();
}
return 0;
}