计算贡献

发布时间 2023-03-28 22:16:46作者: zhujio

Problem - C - Codeforces

 

 

 这句话限制只能用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;
}