首页 > 代码库 > 思维-CF-739A

思维-CF-739A

http://codeforces.com/problemset/problem/739/A

Alyona and mex

对于一个非负整数数列a,定义mex(l, r)为不存在于a[l]~a[r]区间内的最小非负整数。

给定数列长度n,区间个数m。要求构造一个长度为n的数列使得这m个区间的最小mex最大。

输出m个区间的最小mex,以及构造的数列(多组解时只需要输出一组解即可)

解题报告

思路

(一开始没看懂题目....)

对于一个长度为Len的区间,这个区间的mex最大值显然为Len。

那么现在有m个区间,若其中最小区间的长度为Len,那么即使每个区间的mex都能取到最大值,最小mex也为Len。

那么构造数列时只需要保证最小的区间取到最大mex即可。

于是可以用0~Len-1循环构造数列,由于所有数列长度都大于等于Len,就能保证所有区间都能覆盖0~Len-1,那么所得解即为Len。

代码

#include <algorithm>
#include <cstdio>

const int maxn = 100005;
int l, r, n, m;
int minLen;

int main() {
    scanf("%d%d", &n, &m);
    minLen = n;
    for (int i = 0; i < m; i++) {
        scanf("%d%d", &l, &r);
        minLen = std::min(minLen, r - l + 1);
    }
    printf("%d\n", minLen);
    int cnt = 0;
    for(int i=0; i<n; i++){
        printf("%d ", cnt);
        cnt ++;
        cnt %= minLen;
    }
    printf("\n");
    return 0;
}

--(完)--

思维-CF-739A