Submission #70992598


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    if (!(cin >> N)) return 0;
    vector<long long> A(N);
    for (int i = 0; i < N; ++i) cin >> A[i];

    long long S = 0;
    for (auto x : A) S += x;

    if (S % N != 0) {
        cout << -1 << '\n';
        return 0;
    }
    long long T = S / N;

    // Collect indices that actually need changing
    vector<int> idx;          // original indices of "non-balanced" children
    vector<long long> d;      // their differences A[i] - T
    for (int i = 0; i < N; ++i) {
        if (A[i] != T) {
            idx.push_back(i);
            d.push_back(A[i] - T);
        }
    }

    int k = (int)idx.size();
    if (k == 0) {
        // Already equal
        cout << 0 << '\n';
        return 0;
    }

    int FULL = (1 << k) - 1;
    int SZ = 1 << k;

    // Precompute subset sums of d
    vector<long long> subsum(SZ, 0);
    for (int mask = 1; mask < SZ; ++mask) {
        int lsb = mask & -mask;
        int bit = __builtin_ctz(lsb);
        int prev = mask ^ lsb;
        subsum[mask] = subsum[prev] + d[bit];
    }

    const long long INF = (1LL << 60);
    vector<long long> dp(SZ, -1);
    vector<int> choose(SZ, 0);

    function<long long(int)> solve = [&](int mask) -> long long {
        if (mask == 0) return 0;
        if (dp[mask] != -1) return dp[mask];

        long long best = INF;
        int bestSub = 0;

        int lsb = mask & -mask;  // least significant bit in mask

        // Enumerate all submasks of mask that contain lsb and have zero sum
        for (int sub = mask; sub; sub = (sub - 1) & mask) {
            if (!(sub & lsb)) continue;        // must contain the fixed smallest bit
            if (subsum[sub] != 0) continue;    // group must be zero-sum

            long long costInside = __builtin_popcount(sub) - 1; // |sub|-1 ops for this group
            long long rest = solve(mask ^ sub);
            if (rest == INF) continue;
            long long cand = costInside + rest;
            if (cand < best) {
                best = cand;
                bestSub = sub;
            }
        }

        dp[mask] = best;
        choose[mask] = bestSub;
        return best;
    };

    long long minOps = solve(FULL);
    // Should always be finite because total sum is divisible by N
    // and overall sum of d[i] is zero.
    if (minOps >= INF) {
        // Defensive, but shouldn't happen:
        cout << -1 << '\n';
        return 0;
    }

    // Reconstruct groups from 'choose'
    vector<int> groups;
    int curMask = FULL;
    while (curMask) {
        int sub = choose[curMask];
        // sub must be non-zero and zero-sum by construction
        groups.push_back(sub);
        curMask ^= sub;
    }

    // Now construct operations for each group using the "star" method
    vector<tuple<int,int,long long>> ops;
    vector<long long> curA = A; // for sanity check, optional

    for (int gmask : groups) {
        // Collect positions (within idx/d arrays) belonging to this group
        vector<int> posList;
        for (int p = 0; p < k; ++p) {
            if (gmask & (1 << p)) posList.push_back(p);
        }
        if (posList.empty()) continue;

        int rootPos = posList[0];
        int rootIdx = idx[rootPos]; // original index of root child

        // First move from surplus children to root
        for (size_t t = 1; t < posList.size(); ++t) {
            int p = posList[t];
            long long diff = d[p]; // A[idx[p]] - T
            if (diff > 0) {
                int from = idx[p];
                int to   = rootIdx;
                long long z = diff;
                if (z > 0) {
                    ops.emplace_back(from, to, z);
                    curA[from] -= z;
                    curA[to]   += z;
                }
            }
        }
        // Then move from root to deficit children
        for (size_t t = 1; t < posList.size(); ++t) {
            int p = posList[t];
            long long diff = d[p];
            if (diff < 0) {
                int from = rootIdx;
                int to   = idx[p];
                long long z = -diff;
                if (z > 0) {
                    ops.emplace_back(from, to, z);
                    curA[from] -= z;
                    curA[to]   += z;
                }
            }
        }
    }

    // Sanity check (can be removed in final submission)
    // for (int i = 0; i < N; ++i) {
    //     if (curA[i] != T) {
    //         cerr << "Internal error: final candies mismatch\n";
    //         return 0;
    //     }
    // }

    // Output
    cout << (int)ops.size() << '\n';
    for (auto &op : ops) {
        int x, y;
        long long z;
        tie(x, y, z) = op;
        cout << x + 1 << ' ' << y + 1 << ' ' << z << '\n'; // convert to 1-based
    }

    return 0;
}

Submission Info

Submission Time
Task F - Candy Redistribution
User SegMan123
Language C++23 (GCC 15.2.0)
Score 525
Code Size 5037 Byte
Status AC
Exec Time 365 ms
Memory 24024 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 525 / 525
Status
AC × 2
AC × 95
Set Name Test Cases
Sample 00-sample-01.txt, 00-sample-02.txt
All 00-sample-01.txt, 00-sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 01-46.txt, 01-47.txt, 01-48.txt, 01-49.txt, 01-50.txt, 01-51.txt, 01-52.txt, 01-53.txt, 01-54.txt, 01-55.txt, 01-56.txt, 01-57.txt, 01-58.txt, 01-59.txt, 01-60.txt, 01-61.txt, 01-62.txt, 01-63.txt, 01-64.txt, 01-65.txt, 01-66.txt, 01-67.txt, 01-68.txt, 01-69.txt, 01-70.txt, 01-71.txt, 01-72.txt, 01-73.txt, 01-74.txt, 01-75.txt, 01-76.txt, 01-77.txt, 01-78.txt, 01-79.txt, 01-80.txt, 01-81.txt, 01-82.txt, 01-83.txt, 01-84.txt, 01-85.txt, 01-86.txt, 01-87.txt, 01-88.txt, 01-89.txt, 01-90.txt, 01-91.txt, 01-92.txt, after_contest_01.txt
Case Name Status Exec Time Memory
00-sample-01.txt AC 1 ms 3572 KiB
00-sample-02.txt AC 1 ms 3640 KiB
01-01.txt AC 1 ms 3644 KiB
01-02.txt AC 1 ms 3420 KiB
01-03.txt AC 1 ms 3488 KiB
01-04.txt AC 1 ms 3460 KiB
01-05.txt AC 1 ms 3548 KiB
01-06.txt AC 1 ms 3568 KiB
01-07.txt AC 1 ms 3572 KiB
01-08.txt AC 1 ms 3644 KiB
01-09.txt AC 1 ms 3560 KiB
01-10.txt AC 1 ms 3512 KiB
01-11.txt AC 1 ms 3684 KiB
01-12.txt AC 1 ms 3564 KiB
01-13.txt AC 14 ms 23684 KiB
01-14.txt AC 14 ms 23864 KiB
01-15.txt AC 1 ms 3608 KiB
01-16.txt AC 1 ms 3416 KiB
01-17.txt AC 2 ms 4432 KiB
01-18.txt AC 3 ms 5860 KiB
01-19.txt AC 1 ms 3608 KiB
01-20.txt AC 1 ms 3488 KiB
01-21.txt AC 2 ms 3908 KiB
01-22.txt AC 2 ms 3916 KiB
01-23.txt AC 3 ms 5988 KiB
01-24.txt AC 3 ms 5888 KiB
01-25.txt AC 5 ms 8536 KiB
01-26.txt AC 5 ms 8388 KiB
01-27.txt AC 5 ms 8408 KiB
01-28.txt AC 8 ms 13508 KiB
01-29.txt AC 14 ms 23748 KiB
01-30.txt AC 14 ms 23768 KiB
01-31.txt AC 14 ms 23896 KiB
01-32.txt AC 14 ms 23756 KiB
01-33.txt AC 14 ms 23780 KiB
01-34.txt AC 14 ms 23936 KiB
01-35.txt AC 14 ms 23736 KiB
01-36.txt AC 14 ms 23756 KiB
01-37.txt AC 14 ms 23804 KiB
01-38.txt AC 14 ms 23668 KiB
01-39.txt AC 14 ms 23808 KiB
01-40.txt AC 14 ms 23780 KiB
01-41.txt AC 14 ms 23756 KiB
01-42.txt AC 14 ms 24024 KiB
01-43.txt AC 14 ms 23688 KiB
01-44.txt AC 2 ms 3900 KiB
01-45.txt AC 2 ms 4032 KiB
01-46.txt AC 3 ms 5964 KiB
01-47.txt AC 3 ms 5816 KiB
01-48.txt AC 5 ms 8440 KiB
01-49.txt AC 5 ms 8528 KiB
01-50.txt AC 2 ms 3568 KiB
01-51.txt AC 2 ms 3604 KiB
01-52.txt AC 17 ms 23768 KiB
01-53.txt AC 17 ms 23936 KiB
01-54.txt AC 14 ms 23736 KiB
01-55.txt AC 15 ms 23812 KiB
01-56.txt AC 14 ms 23768 KiB
01-57.txt AC 14 ms 23884 KiB
01-58.txt AC 14 ms 23740 KiB
01-59.txt AC 14 ms 23756 KiB
01-60.txt AC 14 ms 23804 KiB
01-61.txt AC 14 ms 23688 KiB
01-62.txt AC 14 ms 23748 KiB
01-63.txt AC 14 ms 23888 KiB
01-64.txt AC 14 ms 23688 KiB
01-65.txt AC 14 ms 23668 KiB
01-66.txt AC 14 ms 23748 KiB
01-67.txt AC 2 ms 3716 KiB
01-68.txt AC 1 ms 3516 KiB
01-69.txt AC 14 ms 23744 KiB
01-70.txt AC 14 ms 23732 KiB
01-71.txt AC 14 ms 23864 KiB
01-72.txt AC 14 ms 23732 KiB
01-73.txt AC 14 ms 23932 KiB
01-74.txt AC 1 ms 3392 KiB
01-75.txt AC 2 ms 4708 KiB
01-76.txt AC 14 ms 23884 KiB
01-77.txt AC 14 ms 23764 KiB
01-78.txt AC 14 ms 23748 KiB
01-79.txt AC 14 ms 23632 KiB
01-80.txt AC 14 ms 23684 KiB
01-81.txt AC 307 ms 23668 KiB
01-82.txt AC 365 ms 23936 KiB
01-83.txt AC 14 ms 23884 KiB
01-84.txt AC 14 ms 23888 KiB
01-85.txt AC 63 ms 23764 KiB
01-86.txt AC 64 ms 23764 KiB
01-87.txt AC 67 ms 23688 KiB
01-88.txt AC 64 ms 23808 KiB
01-89.txt AC 21 ms 8572 KiB
01-90.txt AC 21 ms 8356 KiB
01-91.txt AC 168 ms 23768 KiB
01-92.txt AC 163 ms 23768 KiB
after_contest_01.txt AC 1 ms 3744 KiB