Ravi de vous rencontrer. Je suis un débutant qui a commencé la compétition pro la semaine dernière. J'utilise python maintenant.
Si possible, je souhaite obtenir de bons résultats chez les pros de la compétition sans me fier au C ++! J'ai donc réfléchi à la façon d'augmenter le score avec python.
Par exemple en C ++
#define rep(i,n) for((i)=0;(i)<(int)(n);(i)++)
Il y a beaucoup de gens qui accélèrent comme ça. En bref, cela ressemble à simplifier les descriptions fréquemment utilisées. Je savais d'avant qu'il y avait une telle coutume magique.
Cependant, je ne connais pas la version python de cela même si je fais un pro de la concurrence avec python.
J'ai donc écrit cet article avec l'intention d'apprendre les coutumes des grands professionnels de la concurrence de python. J'espère que cela sera utile à des personnes similaires.
J'ai lu le code de soumission d'une personne forte. Après tout, il y avait une magie similaire à C ++ competition pro, donc je vais essayer de la déchiffrer. (Cité par une certaine personne forte)
Je vais expliquer le code réel dans l'ordre.
sys.setrecursionlimit(10 ** 6)
Définit la profondeur récursive de la fonction récursive. (la valeur par défaut est 1000) Je comprends le sens, mais la nécessité ne me vient pas à l'esprit.
Quand je l'ai recherché, il semble que cela puisse se faire prendre, alors j'ai envie de le régler plus grand pour le moment. Certes, lorsqu'une erreur se produit à cause de cela, cela semble difficile à remarquer.
Ensuite, j'ai trouvé quelque chose comme ça.
int1 = lambda x: int(x) - 1
Une fonction qui renvoie le nombre saisi moins un. Je me demande si c'est le cas ... je ressens l'obsession d'une forte compétition professionnelle lol
p2D = lambda x: print(*x, sep="\n")
Une fonction qui affiche les éléments d'une liste avec un saut de ligne. Certes, quand j'ai fait Atcoder l'autre jour, il y avait une bonne scène avec ce lol
#Convertir l'entrée en entier et recevoir
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def MI1(): return map(int1, sys.stdin.readline().split())
#Reçoit un tableau de toutes les entrées converties en entiers
def LI(): return list(map(int, sys.stdin.readline().split()))
#Reçoit un tableau de toutes les entrées converties en nombres entiers moins 1
def LLI(rows_number): return [LI() for _ in range(rows_number)]
En tant que débutant, j'ai utilisé uniquement input (), donc commencez par trier les différences par rapport à readline ().
--readline () lit également le caractère de saut de ligne de fin --input () efface le caractère de saut de ligne lu (c'est-à-dire la même valeur que readline (). Rstrip ())
Cependant, puisque int ('1 \ n') = 1, il peut être décrit comme ceci. La personne citée utilise readline () comme ceci, mais input () semble être un substitut.
Ensuite, j'ai essayé d'identifier les bibliothèques fréquemment utilisées.
Étant donné que le pop et l'ajout de tableaux sont lents en python, si la réponse est incorrecte en raison du temps d'exécution, écrivez comme suit et utilisez le pont (les deux extrémités de la file d'attente).
from collections import deque
l = deque
l.append(1)
l.pop()
La prochaine histoire sur la duplication d'un tableau
#Si le tableau est unidimensionnel
list2 = list1[:]
#Pour 2 dimensions ou plus
import copy
list2 = copy.deepcopy(list1)
Dans le cas d'une dimension, si "list2 = list1" est défini, list1 sera également réécrit si list2 lui-même est réécrit en raison du passage par référence, alors écrivez-le comme ceci. Dans le cas de 2 dimensions ou plus, la copie profonde est utilisée car elle ne peut pas être décrite comme ceci.
Les tas (files d'attente prioritaires) sont souvent utilisés chez les pros de la compétition. (Par exemple, lors de la recherche de la valeur médiane) Le tas a les propriétés suivantes
La spécification est telle que la valeur minimale arrive à l'apex, donc si vous voulez amener la valeur maximale à l'apex, multipliez-la par -1 et enregistrez-la dans le tas.
Vous pouvez gérer le tas comme suit.
import heapq
heap = []
heapq.heappush(heap, 1)
heapq.heappop(heap)
Lors de l'utilisation d'un dictionnaire normal avec python, il est nécessaire de vérifier si la valeur correspondant à la clé existe. Le dict par défaut vous évite de tels problèmes. (J'ai l'impression qu'il y a beaucoup de situations où je l'utilise même si je ne suis pas un professionnel de la compétition)
Utilisez comme suit
from collections import defaultdict
d = defaultdict(int)
#Pour définir la valeur par défaut lorsqu'il n'y a pas de clé, écrivez comme ceci
d = defaultdict(lambda : 'Initial Value')
Je pense que c'est à peu près comme ça, mais je pense qu'il y a encore beaucoup de choses qui manquent, donc je prévois de le mettre à jour de temps en temps. Je crois que ce genre de connaissances sera utile dans la pratique un jour, et je continuerai à étudier.
Recommended Posts