#include #include #include #include #include #include #include #include using namespace std; int64_t calculateTotalCost(const vector& sceneOrder, const unordered_map>& actorScenes, const unordered_map& actorWages) { unordered_map sceneToIndex; for (size_t i = 0; i < sceneOrder.size(); ++i) { sceneToIndex[sceneOrder[i]] = i; } int64_t totalCost = 0; for (const auto& pair : actorScenes) { int actor = pair.first; const vector& scenes = pair.second; int firstIndex = numeric_limits::max(); int lastIndex = numeric_limits::min(); for (int scene : scenes) { int idx = sceneToIndex[scene]; firstIndex = min(firstIndex, idx); lastIndex = max(lastIndex, idx); } int timeOnSet = lastIndex - firstIndex + 1; totalCost += static_cast(timeOnSet) * actorWages.at(actor); } return totalCost; } vector findNearlyOptimalSceneOrderV2(const vector& scenes, const unordered_map>& actorScenes, const unordered_map& actorWages) { unordered_map sceneWeights; for (const auto& pair : actorScenes) { int actor = pair.first; const vector& scenes2 = pair.second; for (int scene : scenes2) { sceneWeights[scene] += actorWages.at(actor); } } vector sortedScenes = scenes; sort(sortedScenes.begin(), sortedScenes.end(), [&sceneWeights](int a, int b) { return sceneWeights[a] > sceneWeights[b]; }); return sortedScenes; } vector findNearlyOptimalSceneOrderV3(const vector& scenes, const unordered_map>& actorScenes, const unordered_map& actorWages) { unordered_map sceneWeights; unordered_map> actorSceneRanges; for (const auto& pair : actorScenes) { int actor = pair.first; const vector& scenes2 = pair.second; int minScene = *min_element(scenes2.begin(), scenes2.end()); int maxScene = *max_element(scenes2.begin(), scenes2.end()); actorSceneRanges[actor] = make_pair(minScene, maxScene); for (int scene : scenes2) { sceneWeights[scene] += actorWages.at(actor); } } unordered_map sceneScores; for (int scene : scenes) { double waitingCost = 0; for (const auto& pair2 : actorSceneRanges) { int actor = pair2.first; const pair& range = pair2.second; if (range.first <= scene && scene <= range.second) { waitingCost += actorWages.at(actor) * (range.second - range.first + 1); } } sceneScores[scene] = sceneWeights[scene] + waitingCost; } vector sortedScenes = scenes; sort(sortedScenes.begin(), sortedScenes.end(), [&sceneScores](int a, int b) { return sceneScores[a] > sceneScores[b]; }); return sortedScenes; } vector findNearlyOptimalSceneOrderV4(const vector& scenes, const unordered_map>& actorScenes, const unordered_map& actorWages) { unordered_map sceneWeights; unordered_map sceneScores; for (int scene : scenes) { double waitingCost = 0; for (const auto& pair2 : actorScenes) { int actor = pair2.first; const vector& range = pair2.second; sceneScores[scene] += actorWages.at(actor) * pow(range.size(), 0.5); } } vector sortedScenes = scenes; sort(sortedScenes.begin(), sortedScenes.end(), [&sceneScores](int a, int b) { return sceneScores[a] > sceneScores[b]; }); return sortedScenes; } int main() { ifstream inFile("star.in"); int n, m; inFile >> n >> m; vector scenes(m); for (int i = 0; i < m; ++i) { scenes[i] = i + 1; } unordered_map actorWages; for (int i = 1; i <= n; ++i) { int wage; inFile >> wage; actorWages[i] = wage; } unordered_map> actorScenes; for (int scene = 0; scene < m; ++scene) { int actorCount; inFile >> actorCount; for (int i = 0; i < actorCount; ++i) { int actor; inFile >> actor; actorScenes[actor].push_back(scene + 1); } } inFile.close(); int64_t minCost = numeric_limits::max(); vector bestSceneOrder; vector sceneOrder2 = findNearlyOptimalSceneOrderV2(scenes, actorScenes, actorWages); int64_t cost2 = calculateTotalCost(sceneOrder2, actorScenes, actorWages); vector sceneOrder3 = findNearlyOptimalSceneOrderV3(scenes, actorScenes, actorWages); int64_t cost3 = calculateTotalCost(sceneOrder3, actorScenes, actorWages); vector sceneOrder4 = findNearlyOptimalSceneOrderV4(scenes, actorScenes, actorWages); int64_t cost4 = calculateTotalCost(sceneOrder3, actorScenes, actorWages); minCost = min({ cost2, cost3, cost4 }); if (minCost == cost2) { bestSceneOrder = sceneOrder2; } else if (minCost == cost3) { bestSceneOrder = sceneOrder3; } else { bestSceneOrder = sceneOrder4; } ofstream outFile("star.out"); for (size_t i = 0; i < bestSceneOrder.size(); ++i) { if (i > 0) outFile << " "; outFile << bestSceneOrder[i]; } outFile.close(); return 0; }