/* ID: espr1t TASK: KEYWORDS: */ #include #include #include #include #include using namespace std; FILE *in; FILE *out; const int MAX = 1024; int n, m; int cnt; int a[MAX][3]; int minDist; int nxt[MAX]; bool vis[MAX][MAX]; pair dyn[MAX][MAX]; pair recurse(int idx, int rem) { if (rem == 0) return make_pair(true, 0); if (idx >= cnt) return make_pair(false, 0); if (vis[idx][rem]) return dyn[idx][rem]; pair ans(false, 0); // Use current pair use = recurse(nxt[idx], rem - 1); if (use.first) { use.second += a[idx][2]; if (!ans.first || ans.second > use.second) ans = use; } // Skip to next pair skip = recurse(idx + 1, rem); if (skip.first) { if (!ans.first || ans.second > skip.second) ans = skip; } vis[idx][rem] = true; return dyn[idx][rem] = ans; } pair eval(int minDist_) { minDist = minDist_; int rem = 0, last = n, where = -1; for (int i = cnt - 1; i >= 0; i--) { if (a[i][0] != last) { rem = minDist + 1; where = i + 1; last = a[i][0]; } if (rem > 0) { nxt[i] = where; rem--; } else { nxt[i] = i + minDist + 1; } } memset(vis, 0, sizeof(vis)); return recurse(0, m); } int main(void) { in = stdin; out = stdout; in = fopen("arrange.in", "rt"); out = fopen("arrange.out", "wt"); fscanf(in, "%d %d", &n, &m); cnt = 0; for (int i = 0; i < n; i++) { int k; fscanf(in, "%d", &k); for (int c = 0; c < k; c++) { int num; fscanf(in, "%d", &num); a[cnt][0] = i, a[cnt][1] = c, a[cnt][2] = num, cnt++; } } pair ans(-1, 0); int left = 0, right = cnt; while (left <= right) { int mid = (left + right) / 2; pair cur = eval(mid); if (cur.first && cur.second < 0) ans = make_pair(minDist, cur.second); (cur.first && cur.second < 0) ? left = mid + 1 : right = mid - 1; } if (ans.first < 0) { fprintf(out, "-1\n"); } else { fprintf(out, "%d %d\n", ans.first, ans.second); } return 0; }