Solução escrita por Fernando Gonçalves
Conhecimento prévio:
Podemos logo no começo fazer duas operações de tipo 1: " " e " " .
A primeira operação criará as arestas de para , de 2 para , e por aí vai
A segunda criará as arestas de para , de para , e por aí vai.
Portanto, acabaremos criando um grafo especial: uma linha. Nesse grafo, temos os vértices e como bordas e todas os demais vétices estão no meio desses dois.
Note que, se fixarmos uma das bordas para ser , conseguimos descobrir quais são todos os outros vértices apenas pelas suas distâncias até essa borda. Por exemplo, para n = 5, sabemos que o vértice sempre está a de distância do , o está a de distância, etc.
Desta forma, ao acharmos as duas bordas do grafo, podemos gerar as duas permutações possíveis, uma das quais estará correta, cada uma ao fixar uma das bordas como .
Entretanto, ainda resta o problema de achar as bordas do grafo. Afinal, elas podem corresponder a qualquer índice na permutação.
Para achá-las, podemos pegar um indíce na permutação qualquer e, por meio de operações tipo 2, testar todas as distâncias para ele (excluindo ele mesmo, que já sabemos que é zero). A maior dessas distâncias será aquela do indíce de uma das bordas.
Agora que temos uma das bordas, calculamos, pelas operações tipo 2, a distância de todos os índices (novamente, excluindo o da própria borda) para ela e usamos esses valores para conseguir a permutação, considerando que essa borda é .
Por fim, usamos as distâncias para a borda que já calculamos para achar a outra borda, que será a mais distante. Note que, como o grafo é uma linha, as distâncias de cada índice para essa nova borda serão , sendo a distância de cada indíce para a borda antiga. Portanto, podemos calcular, pelo mesmo procedimento da borda antiga, uma permutação que fixa a nova borda como , sem precisar de operações a mais.
Em suma, o algoritmo terá os seguintes passos:
- Faremos duas operações de tipo 1: " " e " ";
- Pegaremos um indíce da permutação arbitrário (por praticidade, ) e calcularemos a distância de todos os índices para esse. Utilizando operações;
- A maior das distâncias será aquela relativa a uma das bordas;
- Calcularemos as distâncias em relação a esta borda que acabamos de achar, usando mais operações;
- Com essas distâncias para a borda, conseguimos achar uma das permutações possíveis;
- Achamos a outra borda, que é aquela que tem maior distância para a borda original.
- Achamos a distância de todos os indíces para a nova borda, que será - . Esse passo não usará nenhuma operação.
- Usamos essas distância em relação à nova borda para calcular uma segunda permutação, que fixa essa nova borda como .
- Usando passos, conseguimos achar duas permutações, uma das quais certamente está correta.
Cheque o código abaixo em caso de dúvida: