从CF1819A学习mex相关问题及assert调试宏

Problem - 1819A - Codeforces

1|0快速计算mex

int calcMex(vector<int> v) { sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()) int n = int(v.size()); for (int i = 0; i < n; ++i) if (v[i] != i) return i; return n; }

2|0<cassert> 调试宏

assert(条件表达式)

为真值,继续执行。非真值,终端报错。

3|0std

// Nikita Golikov, 2023 #include <bits/stdc++.h> using namespace std; using uint = unsigned int; using ll = long long; using ull = unsigned long long; template <class A, class B> bool smin(A &x, B &&y) { if (y < x) { x = y; return true; } return false; } template <class A, class B> bool smax(A &x, B &&y) { if (x < y) { x = y; return true; } return false; } template <class T> int calcMex(vector<T> v) { sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); int n = int(v.size()); for (int i = 0; i < n; ++i) if (v[i] != i) return i; return n; } bool solveTest() { int n; cin >> n; vector<int> a(n); map<int, int> leftOcc, rightOcc; for (int i = 0; i < n; ++i) { cin >> a[i]; rightOcc[a[i]] = i; if (!leftOcc.count(a[i])) leftOcc[a[i]] = i; } int mex = calcMex(a); if (leftOcc.count(mex + 1)) { int L = leftOcc[mex + 1], R = rightOcc[mex + 1]; for (int i = L; i <= R; ++i) { a[i] = mex; } int mx = calcMex(a); assert(mx <= mex + 1); return mx == mex + 1; } for (int i = 0; i < n; ++i) { assert(a[i] != mex); if (a[i] > mex || (leftOcc[a[i]] != rightOcc[a[i]])) { return true; } } return false; } int main() { int t; cin >> t; while (t--) { cout << (solveTest() ? "Yes" : "No") << '\n'; } return 0; }
  • 遇到 mex 的题目,一定要利用 mex 的特性。
  • 比如这题,原数组的 mex 肯定是原数组中未出现的,而且 mex + 1 是可以继承于原数组(只要再加入 mex 并且确保没有 mex + 1 即可)

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17986308.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示