Solução escrita por Arthur Lobo
Conhecimento prévio necessário:
Primeiro, enumeramos todos os possíveis valores de $$x$$, que podem variar de $$0$$ até $$\lceil\sqrt{D} \rceil$$. Isso acontece porque se $$x > \lceil\sqrt{D} \rceil$$, então o melhor $$y$$ é $$0$$. Isso faz com que qualquer solução $$(x,0)$$ ser pior do que $$(\lceil\sqrt{D} \rceil,0)$$.
Com o $$x$$ fixado, basta encontrar qual o melhor valor de $$y$$, ou seja, minimizar $$|D – x^2 – y^2|$$. Fazendo $$C = D – x^2$$, reduzimos o problema para, dado um inteiro $$C$$ minimizar $$|C – y^2|$$.
Se $$C = D- x^2$$ for menor ou igual a $$0$$, então o $$y$$ ótimo é $$0$$.
Se $$C$$ for maior que $$0$$, então o valor ótimo de $$y$$ será $$\lfloor\sqrt{C} \rfloor$$ ou $$\lceil\sqrt{C} \rceil$$.
Com essa solução, podemos varias $$x$$ de $$0$$ até $$\lceil\sqrt{D} \rceil$$ e encontrar os dois valores possíveis de $$y$$ em $$O(1)$$ utilizando a função sqrt do C++. Sendo assim, essa solução funciona em $$O(\sqrt{D})$$.
