Salut,
Pour commencer, désolé de la réponse lente.
Pour répondre à vos interrogations, les contraintes mémoires affichées dans l'énoncé d'un exercice
s'appliquent aux langages les plus bas niveau (C, Rust, ...) qui peuvent se permettre d'utiliser des représentations en mémoire très simples comme celles que vous décriviez. Lorsque vous soumettez un programme dans une autre langage plus lourd (Python, Java, ...) les contraintes sont automatiquement relaxées pour que le problème soit résolvable avec un programme similaire dans tous les langages.
Tous les tests sont soumis à la même contrainte de mémoire et temps, qui est celle affichée dans l'énoncée, et réadaptée dans votre langage.
Enfin, soyez prudent en interprétant la consommation mémoire affichée sur le site quand la limite de mémoire est atteinte, elle peut être trompeuse. Par exemple si la première chose que votre programme essaye de faire est de créer un gros tableau de 1Go, il sera interrompu avant que cette instruction s'applique, et la consommation mémoire affichée sera donc très faible.
Du coup pour conclure, l'exercice et la gestion des contrainte est formatée pour que les candidats puissent résoudre le problème sans avoir à se préoccuper de l'overhead introduit par leur langage.
J'espère que ça vous aura éclairé, en règle générale on préférerai éviter de donner les valeurs précises de limite mémoire par langages pour justement éviter que des candidats en profitent pour chercher une faille et écrire un programme hyperoptimisé dans un langage normalement coûteux.
Bon week'end !