Submission #378650

#TimeUsernameProblemLanguageResultExecution timeMemory
378650abc864197532Gift (IZhO18_nicegift)C++17
49 / 100
2100 ms395220 KiB
#include <bits/stdc++.h>
using namespace std;
#define lli long long int
#define pii pair<int, int>
#define pll pair<lli, lli>
#define X first
#define Y second
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define test(x) cout << #x << ' ' << x << endl
#define printv(x) {\
    for (auto a : x) cout << x << ' ';\
    cout << endl;\
}
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
const int N = 2000000;

lli a[N];
int n, k;

struct op {
    vector <int> ans;
    lli v;
};

void solve_same() {
    if (accumulate(a, a + n, 0ll) % k != 0) {
        cout << -1 << endl;
        return;
    }
    vector <op> ans;
    lli sum = a[0] / (k / __gcd(n, k));
    for (int i = 0; ans.empty() || i; i = (i + k) % n) {
        vector <int> tmp;
        for (int j = i; j < i + k; ++j) tmp.pb(j % n);
        ans.pb({tmp, sum});
    }
    cout << ans.size() << endl;
    for (op i : ans) {
        cout << i.v << ' ';
        for (int j : i.ans) cout << j + 1 << ' ';
        cout << endl;
    }
}

void solve_count() {
    if (accumulate(a, a + n, 0ll) % k != 0) {
        cout << -1 << endl;
        return;
    }
    priority_queue <pii> pq;
    vector <op> ans;
    for (int i = 0; i < n; ++i) pq.emplace(a[i], i);
    while (pq.size() >= k) {
        vector <int> id;
        while (id.size() < k) {
            id.pb(pq.top().Y); pq.pop();
        }
        for (int i : id) {
            a[i]--;
            if (a[i]) pq.emplace(a[i], i);
        }
        ans.pb({id, 1});
    }
    if (pq.empty()) {
        cout << ans.size() << endl;
        for (op i : ans) {
            cout << i.v << ' ';
            for (int j : i.ans) cout << j + 1 << ' ';
            cout << endl;
        }
    } else {
        cout << -1 << endl;
    }
}

int main () {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> k;
    for (int i = 0; i < n; ++i) cin >> a[i];
    if (*max_element(a, a + n) == *min_element(a, a + n)) {
        solve_same();
    } else {
        solve_count();
    }
}

Compilation message (stderr)

nicegift.cpp: In function 'void solve_count()':
nicegift.cpp:56:22: warning: comparison of integer expressions of different signedness: 'std::priority_queue<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   56 |     while (pq.size() >= k) {
      |            ~~~~~~~~~~^~~~
nicegift.cpp:58:26: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   58 |         while (id.size() < k) {
      |                ~~~~~~~~~~^~~
#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...