牛客周赛Round31_D-小红数组操作

很有意思的一道题

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值