#381 Div2 Problem C Alyona and mex (思维 && 构造)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#381 Div2 Problem C Alyona and mex (思维 && 构造)相关的知识,希望对你有一定的参考价值。

题意 : 题目的要求是构造出一个长度为 n 的数列, 构造条件是在接下来给出的 m 个子区间中, 要求每一个子区间的mex值最大, 然后在这 m 个子区间产生的mex值中取最小的输出, 并且输出构造出来的序列, 一个mex值的定义是这个区间没有出现过的最小的正整数, 例如(0, 2, 3)的mex = 1    (0, 1, 2)的mex=3

 

分析 : 发现在这m个mex值中, 最小的肯定是区间长度最小的, 而且这个mex值肯定是等于这个区间的长度, 记这个mex为Min(mex)所以输出的就是长度最小的区间的长度。那如何构造这个数列呢?根据刚刚讲的我们只要保证在长度最小的区间内包含(0、1、2……len-1)这个递增序列里面的所有数便能保证最小的mex, 而其他区间, 由于长度都大于长度最小的区间, 是不是我们也让这些区间也填满(0、1、2……len-1)这个序列内的数(因为其他的长度都比长度最小的区间的长, 所以一定可以做到!), 那其他的这些区间的mex就都<=Min(mex)。这里有个技巧去完成上面所述的操作, 在第 i 个数, 我们只要填上 i%Min(mex) 实际也就是 i%Min(区间len) 即可!很是巧妙!

 

 

技术分享
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int main(void)
{
    int n, m;
    scanf("%d%d", &n, &m);
    int MIN = INF;
    for(int i=0; i<m; i++){
        int l, r;
        scanf("%d%d", &l, &r);
        MIN = min(MIN, r-l+1);
    }
    printf("%d\n", MIN);
    for(int i=0; i<n; i++){///从0或者从1开始都没毛病
        printf("%d ", i%MIN);
    }
    return 0;
}
View Code

 

 

 

以上是关于#381 Div2 Problem C Alyona and mex (思维 && 构造)的主要内容,如果未能解决你的问题,请参考以下文章

#452 Div2 Problem C Dividing the numbers ( 思维 || 构造 )

#417 Div2 Problem C Sagheer and Nubian Market (二分 && std::accumulate)

#415 Div2 Problem C Do you want a data? (math && 前后缀和 && 快速幂)

div2 .c

div2.B C

CODEFORCE ROUND #625 DIV2