#include #include #include //#include using namespace std; //auto start=chrono::high_resolution_clock::now(); int zaplati[10000]; int otg[5000]; int podredba[2][5000], nachkrai[2][10000];//0 - na towa mqsto koi nomer scena e 1-broika na aktiori do taq scena(vkluchitelno) int sceni[5000][5000];//mm int n, m, br = 0, a; long long ans; fstream cinn, coutt; void perm(int is, int r1, int r2, long long res) //indeks koito se razmenq sus sledvashtite { long long res_n=res; if ((br > 4000200) || (br > 2200200 && m * n >= 12000)) { for (int i = 0; i < m; i++) { coutt << otg[i] + 1; coutt << " "; } exit(0); } br++; vector> zasmqna[3]; if (r1 < r2) { int nachi = r1 > 0 ? podredba[1][r1 - 1] : 0; zasmqna[2].push_back({ r1,podredba[1][r1] }); int tmp = r2; r2 = podredba[0][r1]; podredba[1][r1] = nachi + sceni[0][r2]; r1 = podredba[0][tmp]; for (int i = 1; i <= sceni[0][r1]; i++) { if (nachkrai[0][sceni[i][r1]] == nachi + i)//tova e purvoto na tozi aktior { bool a = true; int newpos; for (int ii = 1; ii <= sceni[0][r2]; ii++) { if (sceni[ii][r2] == sceni[i][r1]) { newpos = ii; a = false; break; } } if (a)//nqma go vuv vtoriq segment { newpos = sceni[0][r2] + i; } if (nachkrai[0][sceni[i][r1]] == nachkrai[1][sceni[i][r1]]) { zasmqna[1].push_back({ sceni[i][r1] ,nachkrai[1][sceni[i][r1]] }); nachkrai[1][sceni[i][r1]] = newpos + nachi; } else res = res + (i - newpos) * zaplati[sceni[i][r1]]; zasmqna[0].push_back({ sceni[i][r1] ,nachkrai[0][sceni[i][r1]] }); nachkrai[0][sceni[i][r1]] = newpos + nachi; } else if (nachkrai[1][sceni[i][r1]] == nachi + i)//tova e poslednoto na tozi aktior { int newpos = sceni[0][r2] + i; if (nachkrai[0][sceni[i][r1]] == nachkrai[1][sceni[i][r1]]) { zasmqna[0].push_back({ sceni[i][r1] ,nachkrai[0][sceni[i][r1]] }); nachkrai[0][sceni[i][r1]] = newpos + nachi; } else res = res + (newpos - i) * zaplati[sceni[i][r1]]; zasmqna[1].push_back({ sceni[i][r1] , nachkrai[1][sceni[i][r1]] }); nachkrai[1][sceni[i][r1]] = newpos + nachi; } } for (int i = sceni[0][r2]; i > 0; i--) { if (nachkrai[1][sceni[i][r2]] == nachi + sceni[0][r1] + i)//tova e poslednoto na tozi aktior { bool a = true; int newpos; for (int ii = sceni[0][r1]; ii > 0; ii--) { if (sceni[i][r2] == sceni[ii][r1]) { newpos = sceni[0][r2] + ii; a = false; break; } } if (a)//nqma go v purviq segment { newpos = i; } if (nachkrai[0][sceni[i][r2]] == nachkrai[1][sceni[i][r2]]) { zasmqna[0].push_back({ sceni[i][r2] ,nachkrai[0][sceni[i][r2]] }); nachkrai[0][sceni[i][r2]] = newpos + nachi; } else res = res + (newpos - i - sceni[0][r1]) * zaplati[sceni[i][r2]]; zasmqna[1].push_back({ sceni[i][r2] , nachkrai[1][sceni[i][r2]] }); nachkrai[1][sceni[i][r2]] = newpos + nachi; } else if (nachkrai[0][sceni[i][r2]] == nachi + i + sceni[0][r1])//tova e purvoto na tozi aktior { int newpos = i; if (nachkrai[0][sceni[i][r2]] == nachkrai[1][sceni[i][r2]]) { zasmqna[1].push_back({ sceni[i][r2] ,nachkrai[1][sceni[i][r2]] }); nachkrai[1][sceni[i][r2]] = newpos + nachi; } else res = res + (i + sceni[0][r1] - newpos) * zaplati[sceni[i][r2]]; zasmqna[0].push_back({ sceni[i][r2] ,nachkrai[0][sceni[i][r2]] }); nachkrai[0][sceni[i][r2]] = newpos + nachi; } } if (res < ans) { ans = res; for (int i = 0; i < m; i++) otg[i] = podredba[0][i]; } else if (res == res_n || res-res_n>res_n/10) return; } //for (int i = 0; i < n; i++) cout << i + 1 << " nachalo:" << nachkrai[0][i] << " krai: " << nachkrai[1][i] << endl; // print(); for (int i = is; i < m - 1; i++) { swap(podredba[0][i], podredba[0][i + 1]); perm(i + 1, i, i + 1, res); swap(podredba[0][i], podredba[0][i + 1]); } if (is > 1 && podredba[0][is - 1] == m - 1) { swap(podredba[0][is - 1], podredba[0][is - 2]); perm(is - 1, is - 2, is - 1, res); swap(podredba[0][is - 1], podredba[0][is - 2]); } for (auto g : zasmqna[0]) { nachkrai[0][g.first] = g.second; } for (auto g : zasmqna[1]) { nachkrai[1][g.first] = g.second; } for (auto g : zasmqna[2]) { podredba[1][g.first] = g.second; } } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); //FILE* fp = fopen("test1.txt", "w"); cinn.open("star.in", ios_base::in); coutt.open("star.out", ios_base::out); cinn >> n >> m; for (int i = 0; i < n; i++) { cinn >> zaplati[i]; } for (int i = 0; i < m; i++) { cinn >> sceni[0][i]; otg[i] = i; podredba[0][i] = i; podredba[1][i] = podredba[1][i - 1] + sceni[0][i]; int ak; for (int ii = 1; ii <= sceni[0][i]; ii++) { cinn >> ak; if (i > 0) { if (nachkrai[0][ak - 1] == 0) nachkrai[0][ak - 1] = podredba[1][i - 1] + ii; else nachkrai[0][ak - 1] = min(nachkrai[0][ak - 1], podredba[1][i - 1] + ii); nachkrai[1][ak - 1] = max(nachkrai[1][ak - 1], podredba[1][i - 1] + ii); } else { if (nachkrai[0][ak - 1] == 0) nachkrai[0][ak - 1] = ii; else nachkrai[0][ak - 1] = min(nachkrai[0][ak - 1], ii); nachkrai[1][ak - 1] = max(nachkrai[1][ak - 1], ii); } sceni[ii][i] = ak - 1; } } for (int i = 0; i < n; i++) { if (nachkrai[0][i] > 0) ans += (long long)zaplati[i] * (nachkrai[1][i] - nachkrai[0][i] + 1); } perm(0, -1, -1, ans); // cout << ans << endl; for (int i = 0; i < m; i++) { coutt << otg[i] + 1; coutt << " "; } } /* 5 4 8 6 7 4 6 3 2 4 5 2 4 5 4 1 2 3 5 2 3 4 3 1 2 3 0.4115 */