Doceria – Seletiva IOI 2021

por

Doceria

Comentário por João Pedro Castro

Subtask 2 – $$C_i = E_i = 1$$

Conhecimento prévio necessário:

Como todos os doces tem o mesmo custo, e nesse caso é 1, sempre fazer sentido pegar os $$min(R, N)$$ doces com maior doçura. Para lidar com as mudanças podemos manter um multiset e em cada atualização apagar $$D_{X_i}$$ e adicionar $$F_i$$, para depois pegar os $$min(R, N)$$ doces com maior doçura. A complexidade é $$O(N \cdot (log(N) + min(R, N)))$$.

Clique aqui para ver uma possível implementação.

Subtask 1 – $$E_i = C_{X_i}$$ e $$F_i = D_{X_i}$$

Conhecimento prévio necessário:

Nessa subtask o cenário após toda mudança é o mesmo, logo basta usar uma DP no mesmo modelo da knapsack para calcular a resposta para o problema inicial, e depois imprimir o mesmo valor após cada mudança. A complexidade é $$O(N \cdot R)$$.

Subtask 3 – $$F_i = 0$$

A ideia dessa subtask é a de que nunca faz sentido pegar os doces já atualizados, já que a doçura deles agora é 0. Podemos “renomear” os doces, falando que o primeiro doce a ser atualizado tem número $$N$$, o segundo número $$N – 1$$, etc. Com o último doce a ser atualizado tendo número $$1$$. Agora, podemos rodar uma knapsack normal nessa ordem atualizada, e com $$dp[i][j] =$$ usando os $$i$$ primeiros doces e $$j$$ reais qual a maior doçura atingível. Assim, para a atualização $$k$$ a resposta é $$dp[i – k][R]$$, já que não usamos os últimos $$k$$ doces. A complexidade é $$O(N \cdot R)$$.

Clique aqui para ver uma possível implementação.

Subtask 4 – $$X_i = i$$

Podemos fazer duas knapsacks, com $$pf[i][j] =$$ usando os $$i$$ primeiros doces com seus valores atualizados e $$j$$ reais qual a maior doçura atingível; e $$sf[i][j] =$$ usando os últimos $$i$$ primeiros doces com seus valores não atualizados e $$j$$ reais qual a maior doçura atingível. Assim, para cada atualização $$k$$ sabemos que usaremos uma quantidade $$x \leq R$$ reais nos $$k$$ primeiros doces, conseguindo $$pf[k][x]$$ de doçura, e usaremos $$R – x$$ reais nos últimos $$N – k$$ doces, conseguindo $$sf[N – k][R – x]$$ de doçura. Assim, para cada atualização podemos brutar o $$x$$ ótimo, e deixar $$pf[i][j]$$ e $$sf[i][j]$$ pré-calculados.

Subtask 5 – Sem restrições adicionais

A solução é basicamente a mesma da subtask 4, mas com a ideia adicional da subtask 3 que podemos “renomear” os doces. Assim, renomeamos o primeiro doce a ser atualizado como 1, o segundo como 2, etc, e o último como $$N$$.

Clique aqui para ver uma possível implementação.