D - Range = √Sum
题意:给定n,要求构造出n个不同的数,
使得
题解:
当n是奇数和偶数时分开处理。
1.当n是奇数时,首先将n个数构造以n为平均数间隔为1的等差数列,
其中数组的和为,极差为
。
然后将所有数加2,得到新的数组
,
其中数组的和为,极差为
。
此后再将最大值加1,最小值减1
,
其中数组的和依旧为,但极差变为
。
此时目的是要构造这样的式子
因此将第二大的数字加1即可。
2.当n是偶数时,构造数列
,
其中数组的和为,极差为
。
参考代码如下:
#pragma GCC optimize(2)
#include <iostream>
#include <vector>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <bitset>
#include <unordered_map>
#include <set>
#define quick_cin() cin.tie(0),cout.tie(0),ios::sync_with_stdio(false)
#define endl "\n"
#define pb push_back
#define all(x) x.begin(), x.end()
using namespace std;
const int N = 200010, mod = 1000000007, INF = 1e9;
typedef long long LL;
typedef pair<int, int> PII;
int dx[4] = {1, -1, 1, -1}, dy[4] = {1, 1, -1, -1};
int n, T;
void solve()
{
cin >> n;
if (n & 1)
{
cout << n - (n - 1) / 2 + 1 << " ";
for (int i = n - (n - 1) / 2 + 3; i <= n + (n - 1) / 2; i ++ ) cout << i << " ";
cout << n + (n - 1) / 2 + 2 << " " << n + (n - 1) / 2 + 3 << endl;
}
else
{
for (int i = n / 2; i <= n - 1; i ++ )
cout << i << " ";
for (int i = n + 1; i <= 3 * n / 2; i ++ )
cout << i << " ";
cout << endl;
}
}
int main()
{
quick_cin();
cin >> T;
// T = 1;
while (T -- )
{
solve();
}
return 0;
}