#include #include #include #include #define fi first #define se second using namespace std; typedef vector > vii; typedef pair pii; int sample[10000001]; int main(void){ int n,k; while(scanf("%d %d", &n, &k) == 2){ vii a[n]; vii prefs[2*n+10]; for(int i = 0; i < n; i++){ int samp_in_v; scanf("%d", &samp_in_v); for(int j = 0; j < samp_in_v; j++) scanf("%d", &sample[j]); sort(sample, sample + samp_in_v); int j = 0; int kolik = 1; while(j < samp_in_v-1){ if(sample[j] != sample[j+1]){ a[i].push_back({sample[j], kolik}); kolik = 1; } else kolik++; j++; } a[i].push_back({sample[samp_in_v-1],kolik}); /*printf("vrchol %d\n", i); for(int k = 0; k < samp_in_v; k++){ printf("%d ", sample[k]); } printf("\n"); for(int vzorek = 0; vzorek < a[i].size(); vzorek++){ printf("barva %d kolik %d\n", a[i][vzorek].fi, a[i][vzorek].se); } printf("\n");*/ } for(int end = 1; end <= 2*n; end++){ int psi = 0; int vi = 0; while(psi < prefs[end-1].size() || vi < a[(end-1)%n].size()){ if(psi >= prefs[end-1].size()){ prefs[end].push_back(a[(end-1)%n][vi]); vi++; continue; } if(vi >= a[(end-1)%n].size()){ prefs[end].push_back(prefs[end-1][psi]); psi++; continue; } pii pend = prefs[end-1][psi]; pii aend = a[(end-1)%n][vi]; if(pend.fi == aend.fi){ prefs[end].push_back({pend.fi, pend.se+aend.se}); psi++; vi++; } else if(pend.fi < aend.fi){ prefs[end].push_back(pend); psi++; } else{ prefs[end].push_back(aend); vi++; } } /*printf("vrchol %d\n", end); for(int vzorek = 0; vzorek < prefs[end].size(); vzorek++){ printf("barva %d kolik %d\n", prefs[end][vzorek].fi, prefs[end][vzorek].se); } printf("\n");*/ } int mn = 99999999; for(int end = 1; end <= 2*n; end++){ if(prefs[end].size() < k) continue; int l = 0; int r = end; // printf("zacinam pro %d\n", end); int tmpmin = 99999999; while(l!=r-1){ int sum = 0; bool rnastaveno = false; //printf("%d %d\n",l,r); int mid = (l+r)/2; int midi = 0; for(int bar = 0; bar < prefs[end].size(); bar++){ pii pend = prefs[end][bar]; pii mend = prefs[mid][midi]; if(prefs[end][bar].fi == prefs[mid][midi].fi){ midi++; if(pend.se <= mend.se){ r = mid; rnastaveno = true; break; } else sum += pend.se - mend.se; } else{ sum += pend.se; } } if(!rnastaveno){ l = mid; tmpmin = min(tmpmin,sum); } } mn = min(mn, tmpmin); } printf("%d\n", (mn != 99999999) ? mn : -1); } }