• #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
    ", MIN);
        for(int i=0; i<n; i++){///从0或者从1开始都没毛病
            printf("%d ", i%MIN);
        }
        return 0;
    }
    View Code

     

  • 相关阅读:
    leetcode 437. 路径总和 III
    leetcode 113. 路径总和 II
    题解 【CF387B】George and Round
    题解 【CF489B】 BerSU Ball
    题解【2.23考试T3】val
    题解【2.23考试T1】div
    题解 【洛谷P4290】 [HAOI2008]玩具取名
    题解 【洛谷P1035】[NOIP2002]级数求和
    题解【洛谷P1046】[NOIP2005] 陶陶摘苹果
    题解【洛谷P1618】 三连击(升级版)
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/6930251.html
Copyright © 2020-2023  润新知