1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e5; int n, k; vector<ll> a[maxn + 10], b; ll s[maxn + 10];
bool cmp(const vector<ll> &a, const vector<ll> &b) { return a[0] - a[1] < b[0] - b[1]; }
void dfs(int p, ll sum, ll lim) { if (sum + s[p] < lim) return; if (p == k + 1) b.push_back(sum); else { if (sum + s[p] - a[p][0] + a[p][1] < lim) dfs(k + 1, sum + s[p], lim); else { for (int i = 0; i < (int)a[p].size(); ++i) if (sum + a[p][i] + s[p + 1] < lim) return; else { dfs(p + 1, sum + a[p][i], lim); if ((int)b.size() == n) return; } } } }
int main() { scanf("%d%d", &k, &n); for (int i = 1; i <= k; ++i) { int m; scanf("%d", &m); while (m--) { int x; scanf("%d", &x); a[i].push_back(x); } a[i].push_back(-1e18); sort(a[i].begin(), a[i].end(), greater<ll>()); } sort(a + 1, a + k + 1, cmp); for (int i = k; i >= 1; --i) s[i] = s[i + 1] + a[i][0]; ll l = 0, r = 1e18, ans; while (l <= r) { ll mid = (l + r) >> 1; b.clear(); dfs(1, 0, mid); if ((int)b.size() == n) ans = mid, l = mid + 1; else r = mid - 1; } b.clear(); dfs(1, 0, ans + 1); sort(b.begin(), b.end(), greater<ll>()); for (int i = 0; i < (int)b.size(); ++i) printf("%lld ", b[i]); for (int i = 1; i <= n - (int)b.size(); ++i) printf("%lld ", ans); }
|