构造 2020牛客暑期多校训练营(第六场)Easy Construction

构造 2020牛客暑期多校训练营(第六场)Easy Construction

题目大意:

给出 \(n,k\),构造出一个 \(n\) 的全排列 \(P\) ,使得对于 \(1 - n\) 中任意的数 \(i\)\(P\) 都存在一个长为 \(i\) 的子区间,其和模 \(n\)\(k\)。有解输出任意一组,无解输出 \(-1\)

题解:

一个简单的构造题目,其实之前应该是写过这种类型的题目很多了,但是这次还是反应比较慢,可能太紧张了。

首先判断 \(1-n\) 的和模 \(n\) 是否余 \(k\) ,不是则输出 \(-1\) ,是则开始构造。

很容易可以发现就是这个构造: \(k,1,n-1,2,n-2...\)

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 4e5+10;
int ans[maxn];
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    ll sum = 1ll*n*(n+1)/2;
    if(sum%n==k){
        ans[1]=n;
        int now = 1,f=2;
        if(k) ans[2]=k,f=3;
        for(int i=f;i<=n;i+=2){
            ans[i]=n-now;
            ans[i+1]=now;
            now++;
        }
        for(int i=1;i<=n;i++) printf("%d ",ans[i]);
        printf("\n");
    }
    else printf("-1\n");
    return 0;
}
posted @ 2020-07-29 16:21  EchoZQN  阅读(87)  评论(0)    收藏  举报