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 si si表示第 i i i名成员最早上场的时间。

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

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

因此,我们可以使用 s e t set set来动态维护有多少个 s i ≤ s i + 1 si \le si+1 si≤si+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;
}
相关推荐
彧azz12 分钟前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外1 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55231 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
汉克老师2 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood2 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz3 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕3 小时前
进一步了解模板
c++
叠层归一研究院4 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia5 小时前
Diffusion Model 的基本原理与模型架构
算法
汉克老师6 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程