Files

1.4 KiB

CF739A Alyona and mex

题意

给定 m 个区间,构造出一个长度为 n 的序列,使得这 m 个区间的最小 mex 最大。 mex 定义为最小的没有出现过的自然数。

题解

先观察样例,发现两次输出的 mex 均等于最短的区间长度,显然这不是巧合。

首先很容易得出 $mex(S) \le \lvert S \rvert$,且当 S 覆盖 0\lvert S \rvert - 1 时取等,所以最终答案不会超过最短的区间的长度,然后思考如何构造出答案等于最短区间长度的情况。

求出最短的区间长度为 $x$,只要让这个区间完全覆盖 0, 1, 2, ..., x - 1 ,就可以取到 mex 的最大值,所以则只要在数组中循环填入 $0, 1, 2, ..., x - 1$,就能保证每一个长度大于等于 x 的区间 mex 一定都等于 $x$,因为每一个长度大于等于 x 的区间都至少覆盖一次 $0, 1, 2, ..., x - 1$。(可以自己手搓几个样例试试)

代码

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    int minlen = INT_MAX;
    for (int i = 0; i < m; ++i)
    {
        int l, r;
        scanf("%d%d", &l, &r);
        minlen = min(minlen, r - l + 1);
    }
    printf("%d\n", minlen);
    int cnt = 0;
    for (int i = 1; i <= n; ++i)
        printf("%d ", i % minlen);
    return 0;
}