Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)

题目链接

Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)

思路

我们令 s [ i ] s[i] s[i]表示第 i i i名成员最早上场的时间。

显然,只有当 s s s数组单调不减时才会有解。

换句话说,只有 s [ i ] ≤ s [ i + 1 ] s[i] \le s[i+1] s[i]≤s[i+1]时才有解。

因此,我们可以使用 s e t set set来动态维护有多少个 s [ i ] ≤ s [ i + 1 ] s[i] \le s[i+1] s[i]≤s[i+1],当 s e t set set的大小为 0 0 0时有解,否则无解。

代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
const int mod = 998244353;
const int inf = 1e6;
int n, m, q;
int a[N], b[N], s[N], idx[N];
void solve()
{
	cin >> n >> m >> q;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		idx[a[i]] = i;
	}
	map<int, set<int>> mp;
	for (int i = 1; i <= m; i++)
	{
		cin >> b[i];
		mp[b[i]].insert(i);
	}
	for (int i = 1; i <= n; i++)
	{
		if (!mp.count(a[i]))
		{
			mp[a[i]].insert(inf);
		}
		s[i] = *mp[a[i]].begin();
	}
	s[n + 1] = inf;
	set<int> st;
	for (int i = 1; i <= n; i++)
	{
		if (s[i] > s[i + 1])
		{
			st.insert(i);
		}
	}
	if (!st.size())
	{
		cout << "YA" << endl;
	}
	else
		cout << "TIDAK" << endl;
	while (q--)
	{
		int id, t;
		cin >> id >> t;

		int res = idx[b[id]];
		mp[b[id]].erase(mp[b[id]].find(id));
		if (mp[b[id]].size())
			s[res] = *(mp[b[id]].begin());
		else
			s[res] = inf;
		if (st.count(res))
			st.erase(res);
		if (res > 1 && st.count(res - 1))
			st.erase(res - 1);
		if (s[res] > s[res + 1])
			st.insert(res);
		if (s[res - 1] > s[res] && res > 1)
			st.insert(res - 1);

		b[id] = t;
		res = idx[t];
		mp[t].insert(id);
		s[res] = *mp[t].begin();

		if (st.count(res))
			st.erase(res);
		if (res > 1 && st.count(res - 1))
			st.erase(res - 1);

		if (s[res] > s[res + 1])
			st.insert(res);
		if (s[res - 1] > s[res] && res > 1)
			st.insert(res - 1);

		if (!st.size())
		{
			cout << "YA" << endl;
		}
		else
			cout << "TIDAK" << endl;
	}
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	int test = 1;
	cin >> test;
	for (int i = 1; i <= test; i++)
	{
		solve();
	}
	return 0;
}
相关推荐
许小燚2 小时前
线性表——双向链表
数据结构·链表
董董灿是个攻城狮2 小时前
5分钟搞懂什么是窗口注意力?
算法
Dann Hiroaki3 小时前
笔记分享: 哈尔滨工业大学CS31002编译原理——02. 语法分析
笔记·算法
xiaolang_8616_wjl3 小时前
c++文字游戏_闯关打怪2.0(开源)
开发语言·c++·开源
夜月yeyue4 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
qqxhb4 小时前
零基础数据结构与算法——第四章:基础算法-排序(上)
java·数据结构·算法·冒泡·插入·选择
无小道4 小时前
c++-引用(包括完美转发,移动构造,万能引用)
c语言·开发语言·汇编·c++
晚云与城5 小时前
【数据结构】顺序表和链表
数据结构·链表
FirstFrost --sy6 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
森焱森6 小时前
垂起固定翼无人机介绍
c语言·单片机·算法·架构·无人机