CF2031C

小清新构造题。

\(n\) 按奇偶性分类讨论。当 \(n\) 为偶数时,一个显然的构造形如 \(1,1,2,2,\cdots,n\div2,n\div 2\),相同的数之间距离是 \(0\)\(1\),符合条件。

\(n\) 为奇数时,结合条件可知有一个数要出现 \(3\) 次。考虑将其中任意两个数之间的距离视为三角形一条边的边长,则这个三角形是直角三角形。为了找到最小的长度,我们要让斜边长度最小且三边均为整数。手工模拟不难发现,这个最小的斜边为 \(5\)。那么我们把这个数放在第 \(1,10,26\) 个位置,再看看剩下的空位怎么填上。先按照 \(n\) 为偶数的情况填,得到:

\[1,2,2,3,3,4,4,5,5,1,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,1,13 \]

发现最后的 \(13\) 不满足条件,但前面的数的个数不允许减少,怎么办?仔细观察,发现让第 \(24\) 个位置的 \(12\) 和第 \(27\) 个位置的 \(13\) 交换后,两边都能满足!

\[1,2,2,3,3,4,4,5,5,1,6,6,7,7,8,8,9,9,10,10,11,11,12,13,13,1,12 \]

于是对于 \(n < 27\) 的奇数 \(n\) 无解,对于 \(n \ge 27\) 的奇数 \(n\),先输出上面长度为 \(27\) 的序列,再对剩余部分按偶数情况处理即可。

#include <iostream>
#include <cstdio>
#define int long long
 
using namespace std;
 
int n,tot;
 
void solve( void )
{
	cin >> n;
	tot = 0;
	if( n % 2 )
	{
		if( n < 27 )
		{
			cout << -1 << '\n';
			return;
		}
		n -= 27;
		cout << "1 2 2 3 3 4 4 5 5 1 6 6 7 7 8 8 9 9 10 10 11 11 12 13 13 1 12 ";
	}
	tot = 200000;
	for( int i = 1 ; i <= n ; i ++ )
	{
		if( i % 2 ) tot ++;
		cout << tot << ' ';
	}
	cout << '\n';
	return;
}
 
signed main()
{
//	ios::sync_with_stdio( false );
//	cin.tie( 0 );
//	cout.tie( 0 );
	int T;
	cin >> T;
	while( T -- )
		solve();
	return 0;
}
posted @ 2025-09-08 18:37  FormulaOne  阅读(6)  评论(0)    收藏  举报