Cada processo possui um identificador único (PID), uma quantidade de memória alocada e uma prioridade externa. As mensagens dentro de um processo têm uma prioridade interna. A execução de mensagens é determinada pelo valor HP, calculado como o produto entre a prioridade interna da mensagem e a prioridade externa do processo. Em caso de empate no HP, a mensagem associada ao menor PID é executada primeiro.
Os comandos disponíveis incluem:
CreateProcess(PID, Memória, Prioridade): Cria um novo processo com as especificações fornecidas. Se o PID já existir, gera um erro.AddMessage(PID, Prioridade): Insere uma nova mensagem na fila do processo PID com a prioridade indicada.Run: Seleciona a mensagem com maior HP, exibe o valor e remove-a da fila. Se não houver mensagens, imprime "Empty".ChangePriority(PID, NovaPrioridade): Atualiza a prioridade externa do processo PID.GetMemory(PID, Quantidade): Aumenta a memória alocada para o processo PID.FreeMemory(PID, Quantidade): Diminui a memória alocada; se a memória for ≤ 0, o processo é automaticamente encerrado.RunProcess(PID): Executa a mensagem de maior prioridade interna do processo PID, removendo-a após a execução.CloseMaxMemory: Encerra o processo com mais memória alocada (em caso de empate, escolhe o menor PID).CloseProcess(PID): Encerra o processo com identificador PID.
Em todos os comandos exceto CreateProcess, se o PID não existir, deve-se imprimir "Error". No caso de CreateProcess, se o PID já estiver em uso, também é gerado um erro.
Entrada
A primeira linha contém um inteiro N (1 ≤ N ≤ 100000), representando o número de comandos. As próximas N linhas contêm os comandos no formato descrito. Todos os números são inteiros não negativos e menores que 1.000.000.000.
Saída
A saída deve seguir os formatos especificados nos comandos. Por exemplo, Run deve imprimir "Run: HP" ou "Empty", enquanto RunProcess imprime "Run Process: Prioridade" ou "Empty".
Exemplo de Entrada
11
CloseMaxMemory
CreateProcess(1,100,1)
CreateProcess(2,200,1)
CreateProcess(3,300,1)
AddMessage(1,9)
AddMessage(2,19)
AddMessage(1,10)
GetMemory(2,999)
CloseMaxMemory
Run
RunProcess(1)
Exemplo de Saída
Empty
Run: 10
Run Process: 9
Dica: O tamanho total dos arquivos de entrada pode chegar a 21,8 MB, exigindo eficiência na leitura e estruturas de dados otimizadas.
Implementação Técnica
Utiliza-se um conjunto de estruturas para manter o estado do sistema:
map<int, pair<int, long long>>para armazenar informações de cada processo (prioridade externa e memória).map<int, int>para mapear PIDs a índices em filas de mensagens.priority_queue<int>para cada processo, armazenando prioridades das mensagens (max-heap).set<pair<int, long long>>ordenado por HP para suportarRun.set<pair<int, long long>>ordenado por memória para suportarCloseMaxMemory.
As operações envolvem atualizações constantes dessas estruturas, com cuidado para remover antradas antiguas antes de inserir novas. Funções auxiliares garantem que os valores atuais sejam refletidos em todos os conjuntos relevantes.
Observações importantes:
- É possível criar um processo com memória inicial zero.
- O processo é fechado automaticamente quando sua memória cai para zero ou abaixo.
- Operações como
RuneRunProcessdevem remover a mensagem selecionada da fila.
Esta solução utiliza técnicas de simulação com estruturas de dados ordenadas para garantir eficiência em grandes entradas.