题解 CF1305E 【Kuroni and the Score Distribution】

xht

2020-03-06 13:16:38

Solution

要求构造一个长度为 $n$ 的单调上升序列 $a$,使得恰好有 $m$ 个三元组 $(i,j,k)(i < j < k)$ 满足 $a_i + a_j = a_k$。 很傻的一道构造题。 先 $1,2,3,4,5,\dots$ 的填,产生的三元组个数为 $0,0,1,1,2,\dots$。 一直填到第一次个数 $\ge m$ 的位置,假设多了 $k$ 个。 注意到在这个位置上的数每增加 $2$,个数会减 $1$,因此这个位置上的数加上 $2k$ 即可。 后面的不应该再存在满足条件的三元组了,那么填一定间隔下最大的几个数就够了。 如果填完 $n$ 个数,三元组的数量依旧 $< m$,则说明无解,因为这个填数的方法最大化了三元组的数量。 ```cpp const int N = 5e3 + 7; int n, m, a[N]; int main() { rd(n), rd(m); int t = 0; for (int i = 0; i < n; i++) { a[i] = i + 1; t += i >> 1; if (t >= m) { a[i] += (t - m) << 1; for (int j = n - 1, k = 1e9; j > i; j--, k -= i + 2) a[j] = k; for (int j = 0; j < n; j++) print(a[j], " \n"[j==n]); return 0; } } print(-1); return 0; } ```