QOJ.ac

QOJ

Limite de temps : 10 s Limite de mémoire : 512 MB Points totaux : 100 Difficulté: [afficher] Interactif Hackable ✓

#24229. Mousse

Statistiques

Este é um problema interativo.

Na véspera da abertura do festival de sobremesas, o chef está a aperfeiçoar cuidadosamente a criação emblemática da loja — a “千层幻彩慕斯”. Esta sobremesa é composta por $n$ porções de mousse com sabores diferentes, numeradas $0,1,\dots,n-1$.

Porém, no meio da confusão, o assistente trocou acidentalmente a ordem das porções de mousse. Agora estão alinhadas da esquerda para a direita, formando uma permutação desconhecida de posições $p=(p_0,p_1,\dots,p_{n-1})$, em que $p_i$ representa o número da porção de mousse colocada na posição $i$.

Para determinar a posição exata de cada porção de mousse, pode utilizar um aparelho de teste de sobremesas. Sempre que selecionar três posições distintas entre si $x,y,z$, o aparelho devolverá a soma do menor e do maior número entre essas três porções de mousse:

$$ \min(p_x,p_y,p_z)+\max(p_x,p_y,p_z). $$

O sino da abertura está prestes a tocar. Conseguirá reconstruir com precisão a verdadeira posição de cada porção de mousse através de um número limitado de testes?


Existe uma permutação $p$ de comprimento $n$, cujos elementos são exatamente $0,1,\ldots,n-1$. Não conhece o conteúdo de $p$.

Pode escolher três índices distintos entre si $x,y,z$, e a biblioteca de interação devolverá

$$ \min(p_x,p_y,p_z)+\max(p_x,p_y,p_z). $$

A sua tarefa é reconstruir toda a permutação. O limite de consultas e a forma de calcular a pontuação em função do número de consultas são apresentados abaixo.

Detalhes de implementação

Não precisa de implementar a função main, nem deve fazê-lo. O ficheiro de código-fonte submetido deve conter:

#include "mousse.h"

Deve implementar as duas funções seguintes:

void init(int c);
std::vector<int> mousse(int c, int n);
  • $c$ é o número da subtarefa; $c=0$ indica o exemplo. Cada caso de teste contém exatamente uma instância. Para esse caso de teste, a biblioteca de interação chama init(c) uma vez e, em seguida, chama mousse(c,n) uma vez.
  • mousse deve devolver um vetor de comprimento $n$, cujo elemento no índice $i$ é $p_i$, com índices a começar em $0$.

Pode chamar a função seguinte para efetuar uma consulta:

int query(int x, int y, int z);

É necessário que $0\le x,y,z < n$ e que $x,y,z$ sejam distintos dois a dois. A função devolve $\min(p_x,p_y,p_z)+\max(p_x,p_y,p_z)$.

Como testar o programa

Os anexos incluem mousse.h, a biblioteca de interação local grader.cpp e o programa de exemplo template_mousse.cpp. Guarde o seu programa como mousse.cpp; no diretório deste problema, pode executar:

g++ grader.cpp mousse.cpp -o mousse -O2 -std=c++14
./mousse < mousse1.in

A biblioteca de interação local lê a permutação oculta da entrada padrão. O programa do participante não pode ler esses dados por si próprio. O formato de entrada é o seguinte:

  • A primeira linha contém dois inteiros $c,n$.
  • A segunda linha contém $p_0,p_1,\ldots,p_{n-1}$.

Se a resposta estiver correta, a biblioteca de interação escreve Correct! e Max queries used: Q, em que $Q$ é o número de consultas efetuadas nesse caso de teste; se a resposta estiver errada, escreve Wrong answer.. Quando uma consulta inválida é fornecida ou o limite de consultas é ultrapassado, o programa escreve uma mensagem de erro na saída de erro padrão e termina. Pode adicionar a opção -v para ver o número de consultas desse caso de teste.

Exemplos

Entrada 1

0 10
0 2 9 1 5 8 3 7 6 4

Saída 1

Correct!
Max queries used: 15

Nota

Por exemplo, ao chamar query(0,1,2), os três valores correspondentes são $0,2,9$, e o valor devolvido é $0+9=9$. O programa de referência utiliza $15$ consultas nesta instância. Se utilizar outra estratégia, esse número pode ser diferente.

Restrições

Para todos os dados de teste, $n\in\{10,100,10^5\}$ e $p$ é uma permutação de $0\sim n-1$. Cada caso de teste contém exatamente uma instância.

Número da subtarefa Pontuação $n =$ $Q_{\max} = $ Propriedade especial
$1$ $5$ $10$ $1000$ Nenhuma
$2$ $5$ $100$ $10000$ Nenhuma
$3$ $30$ $10^5$ $2\times10^6$ $p_0=0$
$4$ $60$ $10^5$ $2\times10^6$ Nenhuma

No exemplo, $c=0$ e $n=10$, e o limite de consultas é $1000$.

Pontuação

Atenção:

  • A biblioteca de interação não é adaptativa. A permutação de cada caso de teste é fixada antes de chamar o programa do participante e não muda em função das consultas.
  • Não pode obter a permutação oculta lendo a entrada padrão ou por outros meios não permitidos. A implementação da biblioteca de interação utilizada na avaliação final pode ser diferente da biblioteca local.

Se, num caso de teste, mousse devolver uma resposta errada, os argumentos de query forem inválidos ou o número de consultas ultrapassar o $Q_{\max}$ dessa subtarefa, o multiplicador de pontuação desse caso de teste será $0$.

Nas subtarefas $1,2$, só receberá a pontuação total da subtarefa se todos os casos de teste estiverem corretos.

Para as subtarefas $3,4$, se o multiplicador de pontuação de qualquer caso de teste for $0$, a subtarefa recebe $0$ pontos. Caso contrário, seja $Q$ o maior número de consultas entre todos os casos de teste dessa subtarefa. O multiplicador de pontuação $f(Q)$ é determinado pela tabela seguinte:

Número de consultas $Q_i$ Multiplicador de pontuação $f_i$
$99970$ $100\%$
$99975$ $98\%$
$99981$ $95\%$
$99988$ $90\%$
$99996$ $84\%$
$100000$ $80\%$
$100010$ $74\%$
$100026$ $66\%$
$100051$ $58\%$
$100093$ $52\%$
$150000$ $32\%$
$200000$ $20\%$
$1660964$ $8\%$
$2000000$ $5\%$

Se $Q\le 99970$, então $f(Q)=100\%$. Se $Q$ estiver entre duas linhas consecutivas da tabela, $(Q_i,f_i)$ e $(Q_{i+1},f_{i+1})$, então:

$$ f(Q)=f_i+\frac{Q-Q_i}{Q_{i+1}-Q_i}(f_{i+1}-f_i). $$

A pontuação da subtarefa $3$ é $30f(Q)$, e a pontuação da subtarefa $4$ é $60f(Q)$. A pontuação final é arredondada a $3$ casas decimais.

Limite de tempo: $10\ \mathrm{s}$.

Limite de memória: $512\ \mathrm{MiB}$.

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
#2924EditorialOpenNew Editorial for Problem #24229wangmaruiView

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.