构造 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;
}

浙公网安备 33010602011771号