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

浙公网安备 33010602011771号