제출 #1112643

#제출 시각아이디문제언어결과실행 시간메모리
1112643MisterReaperGift (IZhO18_nicegift)C++17
100 / 100
473 ms116908 KiB
#include <bits/stdc++.h> using i64 = long long; #ifdef DEBUG #include "../../../debug.h" #else #define debug(...) void(23) #endif int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, K; std::cin >> N >> K; std::vector<i64> A(N); for (int i = 0; i < N; ++i) { std::cin >> A[i]; } i64 sum = std::accumulate(A.begin(), A.end(), 0LL); if (sum % K != 0) { std::cout << "-1\n"; return 0; } i64 gsiz = sum / K; int cur = 0; i64 now = 0; std::vector<std::deque<std::pair<i64, i64>>> g(K); for (int i = 0; i < N; ++i) { if (A[i] > gsiz) { std::cout << "-1\n"; return 0; } if (now + A[i] > gsiz) { g[cur].emplace_back(gsiz - now, i); ++cur; now = now + A[i] - gsiz; g[cur].emplace_back(now, i); } else { now += A[i]; g[cur].emplace_back(A[i], i); if (now == gsiz) { ++cur; now = 0; } } } std::vector<std::vector<i64>> ans; while (true) { debug(g); ans.push_back({}); i64 take = g[0].front().first; for (int i = 0; i < K; ++i) { take = std::min(take, g[i].front().first); } ans.back().emplace_back(take); for (int i = 0; i < K; ++i) { ans.back().emplace_back(g[i].front().second); g[i].front().first -= take; if (g[i].front().first == 0) { g[i].pop_front(); } } int bad = 0; for (int i = 0; i < K; ++i) { bad += g[i].empty(); } assert(bad == 0 || bad == K); if (bad == K) { break; } } std::cout << int(ans.size()) << '\n'; for (auto& v : ans) { std::cout << v[0] << ' '; for (int i = 1; i <= K; ++i) { std::cout << v[i] + 1 << " \n"[i == K]; } } 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...