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;
}
相关推荐
为何创造硅基生物11 小时前
C++ 独占指针被销毁后,堆也会自己销毁
c++
C+-C资深大佬11 小时前
C++ 中的 constexpr与 const区
java·开发语言·c++
8Qi811 小时前
LeetCode 4:寻找两个正序数组的中位数 —— 二分查找法
java·算法·leetcode·职场和发展·二分查找
8Qi811 小时前
LeetCode 32:最长有效括号 —— 栈 + 标记法 题解
java·数据结构·算法·leetcode·职场和发展··括号匹配
机器学习之心11 小时前
198种组合算法+优化CNN-LSTM+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备
深度学习·算法·cnn-lstm·shap分析·198种组合算法
Tairitsu_H11 小时前
[LC优选算法#3] 滑动窗口 | 将x减到0的最⼩操作数 | ⽔果成篮 | 字⺟异位词
c++·算法·leetcode·滑动窗口
c++之路11 小时前
CMake 系列教程(一):CMake 基础知识
c语言·开发语言·c++
bIo7lyA8v11 小时前
算法复杂度与能耗关系的多变量分析研究的技术8
算法
Irissgwe11 小时前
C++ STL bitset 和位图详解
开发语言·c++·stl·位图·bitset
洛水水12 小时前
【力扣100题】76.搜索插入位置
数据结构·算法·leetcode