【AtCoder Regular Contest 084 E】Finite Encyclopedia of Integer Sequences

构造。

题目大意:

给定 $N,K$,假设所有长度为 $1\sim N$,每个位置的数是 $1\sim K$ 的数组有 $S$ 个,求字典序排名第 $\frac S 2$ 个的数组。

题解:

如果 $K$ 是偶数,则数组就是 $\frac K 2,K,K,K,\cdots$。

如果 $K$ 是奇数,则我们考虑一个数组 $b=\frac{K+1}{2},\frac{K+1}{2},\frac{K+1}{2},\cdots$。

考虑一个数组 $a$,令 $f(a)=\{K-a_1,K-a_2,K-a_3,\cdots\}$。

可以发现,一个 $a$ 和 $f(a)$ 唯一对应,且当 $a$ 不为 $b$ 的前缀时,$a$ 和 $f(a)$ 总是一个小于 $a$,一个大于 $a$。

我们不难得出最后 $b$ 的排名为 $\frac S 2+\frac N 2$。

往前暴力推 $\frac N 2$ 个位置即可。

Code:

#include<cstdio>
const int N=3e5+5;
int k,n,a[N];
int main(){
    scanf("%d%d",&k,&n);
    if(k&1){
        for(int i=1;i<=n;++i)a[i]=k+1>>1;
        for(int i=1,it=n;i<=n/2;++i){
            if(a[it]==0){
                --a[it-1];
                if(a[it-1]==0)--it;else{
                    for(int i=it;i<=n;++i)a[i]=k;
                    it=n;
                }
            }else --a[it];
        }
        for(int i=1;i<=n;++i)if(a[i])printf("%d ",a[i]);
    }else{
        printf("%d",k/2);
        for(int i=1;i<n;++i)printf(" %d",k);
    }
    return 0;
}