[题解]CF1741B Funny Permutation

思路

简单构造题,我们可以分为三种情况进行构造。

  1. \(n = 3\) 时,一定无解,输出 -1。(你可以试试)

  2. \(n \bmod 2 = 1 \wedge n \neq 3\) 时,我们直接先输出 \(n,n - 1\),然后顺序输出即可。

证明:令 \(a\) 为最后构造出的序列。那么,\(a_1 = n,a_2 = n - 1,a_i = i - 2(3 \leq i \leq n)\)

首先判断 \(a_1,a_2\),因为我们已经特判过 \(3\) 了,因此 \(1 \neq n \wedge 2 \neq n -1\)

再来看后面的,因为 \(a_i = i + 2\),所以 \(a_i\) 一定不等于 \(i\)

又因为,\(a_1 = a_2 + 1 \wedge a_i = a_{i + 1} - 1(3 \leq i \leq n)\)

因此,上述构造方法成立。

  1. \(n \bmod 2 = 0\) 时,直接逆序输出即可。

证明:令 \(a\) 为最后构造出的序列,那么 \(a_i = n - i + 1\)

因为 \(n\) 为偶数。

所以:

  • \(i\) 为偶数时,\(a_i\) 为奇数。

  • \(i\) 为奇数时,\(a_i\) 为偶数。

又因为,一奇一偶一定互不相同且 \(a_i = a_{i - 1} + 1\),满足题目要求。

因此,上述构造方法正确。

Code

#include <bits/stdc++.h>
#define re register

using namespace std;

int T,n;

inline int read(){
	int r = 0,w = 1;
	char c = getchar();
	while (c < '0' || c > '9'){
		if (c == '-') w = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9'){
		r = (r << 3) + (r << 1) + c - 48;
		c = getchar();
	}
	return r * w;
}

int main(){
	T = read();
	while (T--){
		n = read();
		if (n == 3) puts("-1");//特判 
		else if (n & 1){
			// n,(n-1),1,2,3,...,(n-2)
			//这样无论如何也不会重复 
			printf("%d %d ",n,n - 1); 
			for (re int i = 1;i <= n - 2;i++) printf("%d ",i);
			puts("");
		}
		else{
			// n,(n-1),(n-2),...,3,2,1
			//因为 n 为偶数,所以也不会有重复 
			for (re int i = n;i;i--) printf("%d ",i);
			puts("");
		}
	}
	return 0;
}
posted @ 2024-06-24 12:22  WBIKPS  阅读(29)  评论(0)    收藏  举报