【每日一题】ABC194E-Mex Min

2023-10-27

题目内容

原题链接

给定一个长度为 n n n 的整数数组 a a a ,求所有长度为 m m m 的连续子数组的 m e x mex mex 最小值。

数据范围

1 ≤ m ≤ n ≤ 1.5 × 1 0 6 1\leq m\leq n\leq 1.5\times 10^6 1mn1.5×106
0 ≤ a i < n 0\leq a_i<n 0ai<n

题解

首先答案至多为 m m m ,因为一个长度为 m m m 的子数组,最多可以使得 0 0 0 m − 1 m-1 m1 都出现一次,此时答案最大,为 m m m

思路1:树状数组二分

维护每个数在个这个长度为 m m m 的子数组中是否出现,那么只需要求前 i i i 个下标的和是否等于 i i i 即可。这里需要把每个元素的值从 [ 0 , n − 1 ] [0,n-1] [0,n1] 映射到 [ 1 , n ] [1,n] [1,n]

这里还可以进行的优化是答案至多为 m m m ,所以我们只需要考虑 [ 0 , m − 1 ] [0,m-1] [0,m1] 的数即可。

时间复杂度: O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n)

代码1

#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    vector<int> cnt(n);
    vector<int> tr(n + 1);

    auto add = [&](int p, int x) {
        while (p <= n) {
            tr[p] += x;
            p += (p & -p);
        }
    };

    auto query = [&](int p) {
        int res = 0;
        while (p >= 1) {
            res += tr[p];
            p -= (p & -p);
        }
        return res;
    };

    int minv = n;
    for (int i = 0; i < n; ++i) {
        if (++cnt[a[i]] == 1) {
            add(a[i] + 1, 1);
        }

        if (i >= m - 1) {

            if (query(n) < n) {
                int l = 1, r = n;
                while (l < r) {
                    int mid = (l + r) >> 1;
                    if (query(mid) < mid) r = mid;
                    else l = mid + 1;
                }
                minv = min(minv, l - 1);
            }

            if (--cnt[a[i - m + 1]] == 0) {
                add(a[i - m + 1] + 1, -1);
            }
        }
    }

    cout << minv << "\n";

    return 0;
}

思路2:思维

本题是一个滑动窗口,每次窗口中会删去一个旧数 x x x,添加一个新数 y y y,所以这个窗口至多会两个数的变化。

当数 x x x 滑出这个窗口时,判断其在新窗口中是否存在,如果不存在,说明这个新的窗口的 m e x mex mex 至多为 x x x

这里我们考虑滑动窗口移动后,新的窗口中不再有 x x x 的情况,那么必然有 x ≠ y x\neq y x=y ,此时有如下两种情况:

  • x < y x<y x<y ,区间 m e x mex mex 可能减小,如果原区间的 m e x x > x mex_x>x mexx>x ,那么新区间 m e x y = x mex_y=x mexy=x ,否则区间 m e x mex mex 不变
  • x > y x>y x>y ,区间 m e x mex mex 可能增大,但是至多为 x x x

所以用 x x x 可以用来更新答案。

这里需要单独计算第一个区间 [ 0 , m − 1 ] [0,m-1] [0,m1] m e x mex mex

时间复杂度: O ( n ) O(n) O(n)

代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<int> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }

    vector<int> cnt(m);

    // 先计算前 m 个数的 mex
    for (int i = 0; i < m; ++i) {
        if (a[i] < m) cnt[a[i]] += 1;
    }

    int ans = 0;
    while (ans < m && cnt[ans] > 0) ans += 1;

    for (int i = m; i < n; ++i) {
        if (a[i] < m) cnt[a[i]] += 1;
        if (a[i - m] < m) {
            if (--cnt[a[i - m]] == 0) {
                ans = min(ans, a[i - m]);
            }
        }
    }

    cout << ans << '\n';

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【每日一题】ABC194E-Mex Min 的相关文章

  • 【100%通过率 】【华为OD机试 c++/java/python】任务总执行时长【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 任务总执行时长 任务编排服务负责对任务进行组合调度 参与编排的任务有两种类型 其中一种执行时长为taskA 另一种执行时长为taskB 任务一旦
  • 2023华为产品测评官-开发者之声

    2023华为产品测评官 开发者之声 活动激发了众多开发者和技术爱好者的热情 他们纷纷递交了精心编写的产品测评报告 活动社群充满活力 参与者们热衷于交流讨论 互相帮助解决问题 一起探索云技术的无限可能 在此次活动中 华为云CodeArts获得

随机推荐

  • 怎么用计算机算ess tss,"ESS、RSS、TSS"分别表示什么?

    回归平方和 ESS 残差平方和 RSS 总体平方和 TSS 1 回归平方和 是反映自变量与因变量之间的相关程度的偏差平方和 用回归方程或回归线来描述变量之间的统计关系时 实验值yi与按回归线预测的值Yi并不一定完全一致 2 残差平方和是在线
  • ChatGPT 再遭禁用

    近日 三星电子宣布禁止员工使用流行的生成式AI工具 原因在于4月初三星内部发生的三起涉及 ChatGPT 误用造成的数据泄露事件 报道称 三星半导体设备测量资料 产品良率等内容或已被存入ChatGPT学习资料库中 去年11月上线以来 Cha
  • 超高清

    海思 HDR HDR行业面临巨大挑战 01 标准不统一 终端呈现效果参差不齐 HDR多种技术标准共存 缺少终端侧技术实现方案 标准间兼容性较差 不能覆盖主流终端的适配 认证及测试过程 导致终端呈现效果差距大 02 生态碎片化 部分技术方案专
  • Android系统开发之修改Captive Potal Service(消灭感叹号)

    本文原作者 长鸣鸟 未经同意 转载不带名的严重鄙视 谷歌在Android5 0之后的版本加入了CaptivePotalLogin服务 本服务的功能是检查网络连接互联网情况 主要针对于Wi Fi 不让Android设备自动连接那些不能联网的无
  • Visio 2007/2010 左侧"形状"窗口管理

    Visio 2007 2010 左侧 形状 窗口管理 Visio 打开后 通常窗口左侧会有一个 形状 面板 我们可以方便地从中选择需要的形状 有时为了获得更大的版面空间或者不小心关闭了形状面板 怎么把它重新调出来 我们可以从 视图 中把它找
  • 代码随想录算法训练营第三天

    今天是算法训练营的第三天 写了454 四数相加 II这道题目 力扣链接 代码随想录链接 代码如下 class Solution def fourSumCount self nums1 List int nums2 List int nums
  • 独家

    随机森林 概述 当变量的数量非常庞大时 你将采取什么方法来处理数据 通常情况下 当问题非常庞杂时 我们需要一群专家而不是一个专家来解决问题 例如Linux 它是一个非常复杂的系统 因此需要成百上千的专家来搭建 以此类推 我们能否将许多专家的
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 动态规划(五)

    01背包问题 01 Knapsack problem 有10件货物要从甲地运送到乙地 每件货物的重量 单位 吨 和利润 单位 元 如下表所示 由于只有一辆最大载重为30t的货车能用来运送货物 所以只能选择部分货物配送 要求确定运送哪些货物
  • Matplotlib

    1 折线图 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 50 1到1 有五十个点 y 2 x 1 plt figure num 1 figsize
  • 第1课:三位一体定位法,让写作事半功倍

    做最懂技术的传播者 最懂传播的工程师 课程内容分析 本课程的目标是 通过对一系列问题的梳理 找到适合自己的输出状态 确定与理想输出状态之间存在的差距 以及采取什么办法 减少差距 知识要点 1 受众需要什么 省时间的内容 收敛 看过就走 教你
  • java错误-The prefix "aop" for element "aop:aspectj-autoproxy" is not bound.

    配置springmvc的aop时出错 当我向配置文件中添加
  • 年底裁员潮,你有没有被"N+1"?

    2018年11月28日上午 前一天加班到深夜的李女士 又一大早起床匆匆赶去上班了 她在一家垂直电商公司工作多年 岁末将至 一切和往常一样 为了在年前完成比上一季度更高的 KPI 她所在团队经常通宵达旦赶工 李女士准备开始新一天的鸡血工作 主
  • 数学甜点004

    数学是一门及其高深又变幻莫测的学科 且其根本就是问题的解决 因此是不可能也没有必要去寻找一种能够解决所有问题的通解的 坦白说 研究数学的最大乐趣就是在于发现从来没有人走过的新道路 即一种不同于常规的具有跳跃性 构造性的解法 换句话说 无论是
  • 时序预测

    时序预测 MATLAB实现AR时间序列预测 目录 时序预测 MATLAB实现AR时间序列预测 基本介绍 程序设计 学习总结 参考资料 基本介绍 如果某个时间序列的任意数值可以表示自回归方程 那么该时间序列服从p阶的自回归过程 可以表示为AR
  • 你需要知道面试中的10个JavaScript概念

    翻译原文出处 10 JavaScript concepts you need to know for interviews 之前不是闹得沸沸扬扬的大漠穷秋文章 为什么只会Vue的都是前端小白 甚至大多数回头看了 也就会jQuery和Vue这
  • AI绘画

    今天用Midjourney生成了质量极高的美少女武士后续会作为固定栏目来分享美图接下来请欣赏作品 提示词分享 1 an asian girl dressed in samurai style in the style of anime ae
  • 多维时序

    多维时序 MATLAB实现Attention LSTM 注意力机制长短期记忆神经网络 多输入单输出 目录 多维时序 MATLAB实现Attention LSTM 注意力机制长短期记忆神经网络 多输入单输出 基本介绍 模型背景 LSTM模型
  • error C2041: illegal digit ‘9‘ for base ‘8‘

    错误日志 文本 八进制数值超过范围 1 gt E CProject test12 Source c 5 10 error C2041 illegal digit 8 for base 8 十六进制数值超过范围 1 gt E CProject
  • 【每日一题】ABC194E-Mex Min

    题目内容 原题链接 给定一个长度为 n n n 的整数数组 a a a 求所有长度为 m m