码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MEX有关的学习


    MEX是一段区间内未出现的最小正整数。

    所以向该区间加一个数只有加入该区间的mex值时才能增加;

    我们来看两个题目

    Problem - C - Codeforcesicon-default.png?t=M5H6https://codeforces.com/contest/1699/problem/C首先我们可以思考一个区间【L,R】的mex是x,说明【0,x-1】肯定都出现过了,所以如果x的位置在该区间内部则可以在区间内任意一个未被使用的位置,如果不在该区间内就只能在那个位置不动了,因为x一旦动那么该序列的mex值肯定会受到影响。

    1. int a[MAXN];
    2. int pos[MAXN];
    3. const int mod = 1e9 + 7;
    4. void solve() {
    5. int n;
    6. ll ans = 1;
    7. scanf("%d", &n);
    8. for (int i = 1; i <= n; i++) {
    9. scanf("%d", a + i);
    10. pos[a[i]] = i;
    11. }
    12. int mx = -INF, mn = INF;
    13. for (int i = 0; i < n; i++) {
    14. if (pos[i] > mn && pos[i] < mx) {
    15. ans *= (mx - mn + 1 - i);
    16. ans %= mod;
    17. }
    18. mn = min(mn, pos[i]);
    19. mx = max(mx, pos[i]);
    20. }
    21. printf("%lld\n", ans);
    22. }

     Problem - C - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/contest/1629/problem/C

    然后是这一题 需要求我们能得出得最大字典序序列,所以我们b序列中得到得元素肯定是能选到得最大得mex,所以我们可以维护一个前缀mex和后缀mex,当我们的前缀mex此时等于最大的mex时候就可以加入答案数组,然后直接从下一点开始把mex值替换成后缀mex的值

    1. struct MEX {
    2. int cot[MAXN];
    3. vector<int> res;
    4. int id = 0;
    5. void add(int x) {
    6. cot[x]++;
    7. res.push_back(x);
    8. }
    9. int mex() {
    10. while (cot[id])
    11. id++;
    12. return id;
    13. }
    14. void clear() {
    15. for (int v : res) {
    16. cot[v]--;
    17. }
    18. id = 0;
    19. res.clear();
    20. }
    21. };
    22. MEX now, t;
    23. int a[MAXN];
    24. int last[MAXN];
    25. void solve() {
    26. now.clear();
    27. t.clear();
    28. int n;
    29. scanf("%d", &n);
    30. for (int i = 1; i <= n; i++) {
    31. scanf("%d", a + i);
    32. }
    33. for (int i = n; i >= 1; i--) {
    34. t.add(a[i]);
    35. last[i] = t.mex();
    36. }
    37. vector<int> ans;
    38. int mx = last[1];
    39. for (int i = 1; i <= n; i++) {
    40. now.add(a[i]);
    41. if (mx == now.mex()) {
    42. ans.push_back(mx);
    43. mx = last[i + 1];
    44. now.clear();
    45. }
    46. }
    47. printf("%d\n", ans.size());
    48. for (int v : ans) {
    49. printf("%d ", v);
    50. }
    51. putchar('\n');
    52. }

  • 相关阅读:
    Go错误处理方式真的不好吗?
    JAVA SE 基础总结
    爬虫基本原理介绍、实现以及问题解决
    Golang入门笔记(4)—— 流程控制之if分支
    查看python安装的各种库各种包的版本
    数据仓库与ETL
    设计模式之装饰者模式
    使用 Pandas 和 SQL 进行实用数据分析,让我们用 pandas 和 SQL 进行数据分析并实际理解它们(教程含数据csv)
    最新1688商品列表接口JS逆向分析
    java设计模式7,工厂方法模式 | 文末送《Java核心技术》第12版
  • 原文地址:https://blog.csdn.net/Ghostttttttiii/article/details/125620391
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号