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 |
|
|
| 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 |