计算贡献
这句话限制只能用2构造,用1构造可能会出现0,使得第三个条件不满足
先预处理出连续i个数对答案的贡献,再二分查找最后一个小于等于k的值
然后在这个数后面构造一个
2 * ( k - pre[idx] - idx) - 1
例如 2 2 2 贡献是6
这样构造 2 2 2 -7 贡献是6
这样构造 2 2 2 -5 贡献是7
类似这样构造
#include<bits/stdc++.h> using namespace std; typedef long long ll; int pre[35]; int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T = 1; cin >> T; int sum = 0; for (int i = 1; i <= 30; i++) { sum += i; pre[i] = sum; //cout << pre[i] << endl; } while (T--) { int n, k; cin >> n >> k; int idx = upper_bound(pre+1, pre + n+1, k) - pre - 1; for (int i = 1; i <= n; i++) { if (i <= idx)cout << 2 << ' '; else if (i == idx + 1)cout << 2 * (k-pre[idx] - idx) - 1 << " "; else cout << -1000 << ' '; } cout << endl; } return 0; }