[PYTHON] Journal de dévotion professionnelle compétitif 11e au 14e jour (7/5 au 7/8)

Impressions

J'ai raté une journée, mais je veux rester motivée et continuer ce mois-ci. J'espère stabiliser les problèmes de bleu clair et bleu pendant ce journal de dévotion et devenir un codeur bleu. Je dois également étudier pour la recherche de fin d'études, alors je veux faire de mon mieux. Je tâtonne parce que je ne sais pas à quel point il est facile à lire, mais j'espère pouvoir le mettre à jour une fois tous les trois jours.

11ème jour

ABC132-E Hopscotch Addict

Temps pris

Environ 30 minutes

Considération

** Nous utiliserons BFS ** pour trouver la distance la plus courte sans poids. Tout d'abord, j'ai pensé à une méthode pour mettre à jour la destination à atteindre quand trois Kenkenpa consécutifs comme nouveau côté, mais si vous pensez au côté s'étendant de chaque sommet dans l'ordre, ** évidemment ce n'est pas à temps et il y a beaucoup de calculs inutiles **. Je l'ai rejeté.

Ici, en supposant que vous puissiez atteindre la destination (mouvement d'au plus $ M $ fois), si vous le répétez 3 fois, ce sera un multiple de 3, donc à la fin ** mouvement d'au plus 3 $ \ fois M $ fois ** J'ai remarqué ça De plus, comme mentionné ci-dessus, si vous pouvez paraphraser ** pour atteindre la destination à une distance qui est un multiple de 3 **, considérez la distance la plus courte dans chacun des trois états où la distance pour atteindre la destination est divisée par trois. Je sais que c'est bon.

Par conséquent, en considérant la méthode Dyxtra étendue dans laquelle chaque sommet a un état **, et le BFS étendu ** dans lequel chaque sommet a trois états, un tableau qui stocke la distance la plus courte comme un BFS normal ($ score [$ score [ i] [j]: = i $ Uniquement lorsque la distance la plus courte au troisième sommet est divisée par 3 et que le reste est $ j $ (la distance la plus courte du mouvement) et que le tableau devient inf. S'il peut être mis à jour, il peut être implémenté avec $ O (M + N) $.

<détails>

Code Python </ summary>

abc132e.py


import sys
sys.setrecursionlimit(10**6)
from collections import deque
n,m=map(int,input().split())
edges=[[] for i in range(n)]
for i in range(m):
    u,v=map(int,input().split())
    edges[u-1].append(v-1)
s,t=map(int,input().split())
inf=100000000000
score=[[inf]*3 for i in range(n)]
now=deque()
now.append(s-1)
score[s-1][0]=0
def bfs(dep,l):
    global n,m,edges,s,t,score,inf,now
    f=False
    for i in range(l):
        ne=now.popleft()
        for j in edges[ne]:
            if score[j][dep%3]==inf:
                score[j][dep%3]=dep
                now.append(j)
    l_ne=len(now)
    if l_ne:bfs(dep+1,l_ne)
bfs(1,1)
if score[t-1][0]!=inf:
    print(score[t-1][0]//3)
else:
    print(-1)

12ème jour

J'ai résolu l'ABC173-E que je ne pouvais pas passer pendant le concours. Il est résumé dans cet article.

13ème jour

Je n'étais pas doué pour utiliser le temps. Je suis désolé.

Jour 14

ABC135-D Digits Parade

Temps pris

25 minutes

Considération

Depuis que je l'ai regretté, j'ai réglé le problème de la basse diff au plus vite. J'ai l'impression d'avoir résolu un problème similaire avant cela, mais je suis heureux d'avoir pu AC dans un laps de temps raisonnable. Cependant, puisque j'ai publié RE une fois, je le regrette.

Tout d'abord, le plus gros point est de remarquer DP. ** C'est une chaîne de caractères et il est difficile de traiter la? Part **, la **? Part est considérée comme augmentant le nombre de candidats (la méthode de transition $ \ leftrightarrow $ augmente) **, ** avec cette chaîne de caractères Considérant que le reste du nombre affiché est déterminé en décidant les chiffres un par un **, je pense qu'il n'est pas difficile d'expédier un DP qui considère l'état de chaque chiffre.

Ici, considérons l'état d'un entier donné (chaîne de caractères représentant) lors de la recherche de ** $ i $ chiffres **, mais ici, en considérant le reste, $ dp [i] [j]: = i Il est bon de savoir combien de nombres sont $ j $ lorsque vous regardez le chiffre $ et divisez par 13.

Ensuite, concernant la transition de DP, les deux cas suivants doivent être considérés ($ p [i] $ est précalculé en divisant $ 10 ^ i $ par 13).

① Lorsque le chiffre $ i $ est $ k (0 \ leqq k \ leqq 9) $ La destination de transition de $ dp [i] [j] $ est $ dp [i + 1] [(j + k * p [i])% 13] $.

② Lorsque le chiffre $ i $ est? Tout ce que vous avez à faire est de faire $ l $ du motif ① de 0 à 9.

Aussi, j'ai essayé de trouver $ p [i] $ dans la boucle qui effectue DP, mais comme il est nécessaire de trouver $ 10 ^ {10 ^ 5-1} $ au maximum, calculez seulement le reste en premier. J'ai essayé de le quitter.

Après avoir implémenté ce qui précède, le code est le suivant.

<détails>

Code Python </ summary>

abc130e.py


mod=10**9+7
s=input()[::-1]
l=len(s)
dp=[[0]*13 for i in range(l+1)]
dp[0][0]=1
#Pré-calcul car la puissance est trop importante
p=[0]*l
p[0]=1
for i in range(l-1):
    p[i+1]=(p[i]*10)%13
for i in range(l):
    s_sub=s[i]
    if s_sub=="?":
        for j in range(13):
            for k in range(10):
                dp[i+1][(j+k*p[i])%13]+=dp[i][j]
                dp[i+1][(j+k*p[i])%13]%=mod
    else:
        k=int(s_sub)
        for j in range(13):
            dp[i+1][(j+k*p[i])%13]+=dp[i][j]
            dp[i+1][(j+k*p[i])%13]%=mod
print(dp[l][5])

ABC133-E Virus Tree 2

Temps pris

Cela prend presque une heure mais WA

Cause d'erreur

Je ne pouvais pas du tout déboguer parce que je l'ai implémenté différemment de ma propre considération. ** Je n'avais pas assez de pouvoir pour croire en mes pensées **, non? Je ne suis pas très doué pour déboguer de tels modèles, mais est-ce une expérience ...? ??

Considération

Premièrement, puisqu'il s'agit d'un arbre, on peut dire que ** côtés sont N-1 côtés, tous les sommets sont connectés et il n'y a pas de chemin fermé **. De plus, la distance entre deux sommets différents (le nombre minimum de côtés requis pour le tracé) est de 2 ou moins (1 ou 2).

Ici, ** tout arbre peut être considéré comme un arbre enraciné **, j'ai donc décidé de considérer un arbre dont la racine est le sommet 1. De plus, ** il est préférable de peindre une couleur à la fois pour que les voisins soient peints différemment **, donc pour le moment, j'ai peint du sommet le plus proche de la racine. (Si c'était impossible, j'avais l'intention de l'appliquer à partir des feuilles à l'envers.)

Ici, afin de confirmer comment peindre, j'ai décidé de considérer un arbre avec 8 sommets et 7 côtés comme le montre la figure ci-dessous. De plus, dans la figure ci-dessous, quel sommet ne doit pas être différent lorsque la peinture par le haut est indiquée en rouge.

IMG_0459.PNG

La verbalisation de la façon de peindre les couleurs dans la figure ci-dessus est la suivante.

Premièrement, il existe des façons $ K $ de peindre les racines. Comme la couleur des sommets autres que la racine est différente de la couleur des sommets dont la distance est 1 ou 2, ** parent **, ** parent parent **, ** frère (sommets avec le même parent) * Différent de *. Ici, puisque le parent du parent n'existe pas au sommet de la profondeur 1, ** Comment peindre la couleur du frère ** peut être sélectionné parmi $ K-1 $ couleurs de rue autres que le parent $ \ _ {K-1} P \ _ {nombre total de frères et sœurs} $. De plus, comme il y a toujours un parent du parent au sommet de la profondeur 2, choisissez parmi $ K-2 $ des couleurs de rue autres que le parent et le parent du parent $ \ _ {K-2} P \ _ {frère Le nombre total de} $ sera.

Ici, quand j'ai enregistré comment peindre la couleur de mon frère, je l'ai enregistrée une fois dans le tableau, mais ** j'enregistrais la mauvaise valeur **. Ce serait très décevant si je pouvais faire le cas de test avec précision par moi-même ainsi que l'échantillon.

<détails>

Code Python </ summary>

abc133e.py


from sys import setrecursionlimit
setrecursionlimit(10**6)
n,k=map(int,input().split())
paths=[[] for i in range(n)]
for i in range(n-1):
    a,b=map(int,input().split())
    paths[a-1].append(b-1)
    paths[b-1].append(a-1)
inf=100000000000000
nums=[-inf]*n
nums[0]=k
from collections import deque
now=deque()
now.append(0)
def bfs(d):
    global n,k,paths,nums,now
    l=len(now)
    if d==1:
        for i in range(l):
            p=now.popleft()
            ln=len(paths[p])
            next_num=k-1
            for j in range(ln):
                if nums[paths[p][j]]==-inf:
                    nums[paths[p][j]]=next_num
                    now.append(paths[p][j])
                    next_num-=1
    else:
        for i in range(l):
            p=now.popleft()
            ln=len(paths[p])
            next_num=k-2
            for j in range(ln):
                if nums[paths[p][j]]==-inf:
                    nums[paths[p][j]]=next_num
                    now.append(paths[p][j])
                    next_num-=1
    if len(now):bfs(d+1)
bfs(1)
ans=1
for i in range(n):
    if nums[i]<=0:
        print(0)
        exit()
    ans*=nums[i]
    ans%=(10**9+7)
print(ans)