[CF1713C Build Permutation] 题解
水一篇题解
先来证明一点小东西:在 n , n + 1 , n + 2 ⋯ 2 n n,n+1,n+2\cdots 2n n,n+1,n+2⋯2n 中一定有一个完全平方数 k k k 。
假设 k = ⌈ n ⌉ 2 k={\lceil \sqrt{n} \rceil}^2 k=⌈n⌉2 则 k ≥ n k\ge n k≥n 。
根据上取整的定义可知 ⌈ n ⌉ ≤ n + 1 {\lceil \sqrt{n} \rceil} \le \sqrt{n} + 1 ⌈n⌉≤n+1
平方可得 k = ⌈ n ⌉ 2 ≤ n + 2 n + 1 k = {\lceil \sqrt{n} \rceil}^2 \le n + 2\sqrt{n} + 1 k=⌈n⌉2≤n+2n+1
因为 k ≤ 2 n k \le 2n k≤2n 所以 n ≥ 2 n + 1 n \ge 2\sqrt{n} + 1 n≥2n+1
解的 n ≥ 1 2 + 3 2 ≈ 1.37 \sqrt{n} \ge \dfrac{1}{2} + \dfrac{\sqrt{3}}{2} \approx 1.37 n≥21+23≈1.37 成立,此时 n ≥ 1.87 n \ge 1.87 n≥1.87
代入 n = 1 n=1 n=1 ,发现也成立,既命题成立,证毕。
可以将上面的命题转化为 0 ≤ k − n ≤ n 0 \le k-n \le n 0≤k−n≤n 其中 k k k 为完全平方数,只需找到 k k k 便可以将 [ k − n , n ] [k-n,n] [k−n,n] 匹配好,然后只需递归求解即可。
贴上核心代码:
inline void trav(int n) {
if (n <= 0)
return;
int k = sqr(ceil(sqrt((double)n - 1)));
int l = k - n + 1, r = n;
for (int i = l; i < r; i++)
arr[i] = k - i;
trav(l);
}