Submission #1314686

#TimeUsernameProblemLanguageResultExecution timeMemory
1314686Sam_a17Gift (IZhO18_nicegift)C++20
0 / 100
221 ms51656 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

int n, k;
long long a[N];

int comp_num;
deque<pair<long long, int>> components[N / 1000];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> k;

    long long sum = 0, mx = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        sum += a[i];
        mx = max(mx, a[i]);
    }

    if (sum % k != 0 || mx > (sum / k))
    {
        cout << -1 << '\n';
        return 0;
    }

    long long needSum = sum / k;

    long long blockSum = 0;
    for (int i = 1; i <= n; i++)
    {
        if (blockSum + a[i] <= needSum)
        {
            blockSum += a[i];
            components[comp_num].push_back(make_pair(a[i], i));
        }
        else
        {
            a[i] -= needSum - blockSum;
            blockSum = needSum;
            i--;
        }

        if (blockSum == needSum)
        {
            comp_num++;
            blockSum = 0;
        }
    }

    vector<vector<long long>> ans;

    while (sum)
    {
        long long min_sum = INT64_MAX;
        for (int i = 0; i < comp_num; ++i)
        {
            assert(components[i].size());
            min_sum = min(min_sum, components[i].front().first);
        }

        vector<long long> seq;
        seq.push_back(min_sum);

        for (int i = 0; i < comp_num; ++i)
        {
            assert(components[i].size());
            seq.push_back(components[i].front().second);
            components[i].front().first -= min_sum;
            if (!components[i].front().first)
            {
                components[i].pop_front();
            }
        }

        sum -= min_sum * comp_num;
        ans.push_back(seq);
    }

    cout << ans.size() << '\n';
    for (auto& i : ans)
    {
        for (auto j : i)
        {
            cout << j << " ";
        }
        cout << '\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...