从CF1935B学习维护前后缀区间mex

Problem - B - Codeforces

维护前缀区间mex和后缀区间mex,枚举二者相同的断点

1|0原理

随区间增长,mex 只可能增,不可能减,所以可以用一个变量维护目前的 mex,区间扩大后可以直接沿用较小区间的 mex,再处理增加即可。

2|0维护 mex

std::set<int> S;//当前集合内的元素 int mex(0);//当前mex for (int i = l; i < r; i++) { S.insert(a[i]); while(S.contains(mex)) { mex++; } }

3|0代码

void solve() { int n; std::cin >> n; std::vector<int> a(n); for (auto& x : a) std::cin >> x; std::set<int> preS, sufS; std::vector<int> pre(n), suf(n); int preMex(0), sufMex(0); for (int i = 0; i < n; i++) { preS.insert(a[i]); while(preS.contains(preMex)) { preMex++; } pre[i] = preMex; } for (int i = n - 1; i >= 0; i--) { sufS.insert(a[i]); while(sufS.contains(sufMex)) { sufMex++; } suf[i] = sufMex; } for (int i = 0; i < n; i++) { if (pre[i] == suf[i + 1]) { std::cout << 2 << '\n'; std::cout << 1 << ' ' << i + 1 << '\n'; std::cout << i + 1 + 1 << ' ' << n << '\n'; return ; } } error; return ; }

__EOF__

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