Auteur du problème: | De3b0o |
Préparé par: | De3b0o |
Édité par: | Hasan Saleh (MathModel) |
Solution
Tout au long de la solution, nous allons supposer que n \le m, sinon nous pouvons simplement faire pivoter la grille.
Nous ne pouvons pas nous permettre de simuler chaque requête cellule par cellule. Au lieu de cela, nous traitons ligne par ligne.
Pour une ligne fixe , considérons une requête (x,y,d,c,s). Toutes les cellules qui satisfont la première condition (la condition de distance) forment un intervalle [l,r].
Ainsi, chaque requête ajoute un intervalle à la ligne .
Nous pouvons utiliser une approche de ligne de balayage pour calculer toutes les valeurs du tableau pour la ligne .
Pour la ligne , nous créons des événements à et r+1 pour l'intervalle [l,r]. Chaque événement signifie : "commencer à ajouter cette requête" ou "arrêter d'ajouter cette requête".
Nous maintenons un tableau de fréquence = total des requêtes actives avec le paramètre . Nous maintenons également somme de tous les actifs.
Lors du traitement de la ligne et de la colonne :
Si a_{i,j}=0, alors b_{i,j}=sum.
Sinon, pour chaque diviseur de a_{i,j}, ajoutez à b_{i,j}.
En conclusion :
nous itérons sur toutes les lignes (1 \le i \le n), pour chaque ligne nous itérons sur toutes les requêtes et trouvons l'intervalle [l,r] pour chaque requête, puis en utilisant une approche de ligne de balayage, nous pouvons déterminer les valeurs du tableau pour cette ligne.
Complexité :
Précomputation des diviseurs : \mathcal{O}(n \cdot m \cdot \sqrt{\max A}).
Pour chaque ligne, nous itérons sur toutes les requêtes donc c'est \mathcal{O}(n \cdot q).
Pour chaque cellule , nous itérons sur tous les diviseurs de a_{x,y} donc c'est \mathcal{O}(n \cdot m \cdot \max D).
La complexité totale est \mathcal{O}(n \cdot m \cdot (\sqrt{\max A} + \max D) + n \cdot q), et puisque n \le m, alors n \le \sqrt(n \cdot m) \le 320, <= 10^6, \max D = 240.
Rendant la pire complexité totale ce qui passe en moins de 4 secondes.
Voici l'implémentation :
// Code C++ ici