[PYTHON] AtCoder Débutant Contest 170 Critique

Les résultats de cette fois

スクリーンショット 2020-06-15 13.19.30.png

Impressions de cette époque

J'ai fait une grosse erreur après un long moment. Je ne pensais pas que D ne passerait pas, mais si vous réfléchissez calmement, vous ne pouvez pas le passer avec Python ou PyPy en termes de volume de calcul ... J'ai résolu E dans la seconde moitié, mais ça fait mal d'avoir un bug dans l'implémentation ... La rapidité de mise en œuvre semble devoir être entraînée à plusieurs reprises pour s'y habituer.

Quand je jouais au golf codé, j'étais en retard pour publier un article. J'essaierai de jouer au code golf après avoir terminé l'examen ...

Problème A

Puisqu'il s'agit d'une chaîne entière après la substitution de 0, l'index de l'élément qui devient 0 peut être calculé par 1-indexed.

A.py


x=list(map(int,input().split()))
print(x.index(0)+1)

Problème B

Considérez combien d'animaux sont respectivement des grues et des tortues. Il y a 0 à x grues et tortues, et si vous décidez combien d'entre elles sont, l'autre sera décidée, et si vous savez combien d'entre elles, le nombre de pattes sera décidé, alors cherchez une combinaison qui sera y.

B.py


x,y=map(int,input().split())
for i in range(x+1):
    if 2*i+4*(x-i)==y:
        print("Yes")
        break
else:
    print("No")

Problème C

Récemment, j'ai le sentiment qu'il y a des problèmes à prendre en compte chez C. Calcul d'un entiery \notin \\{p_1,p_2,…,p_n\\}Découvrez tous les nombres entiers possibles|y-X|Est minimiséyIl suffit de demander.1 \leqq X,p_1,p_2,…,p_n \leqq 100Quey \leqq 0À ce moment-lày=0Est le plus petity \geqq 101À ce moment-lày=101C'est le minimum. Donc,y=0~101alors|y-X|が最小となるものを求めれば良いalorsす。

C.py


x,n=map(int,input().split())
p=sorted(list(map(int,input().split())))
q=[0]*(102)
for i in range(n):
    q[p[i]]=1
ans=(1000000,-1)
for i in range(102):
    if q[i]==0:
        if ans[0]>abs(i-x):
            ans=(abs(i-x),i)
print(ans[1])

Problème D

Il a été écrit dans la Réponse que cela peut être fait par la même opération que le tamis Eratostenes, mais j'ai été forcé à $ O (N \ sqrt { A_ {max}}) Je l'ai passé avec $. Puisque la quantité de calcul est à peine suffisante pour Python et PyPy, je l'ai changé en C ++. De plus, je n'ai pas pu prendre cette décision pendant le concours, alors j'ai senti que je devais être ** calme. ** Lorsque $ A_i $ est divisible par $ A_j $, $ A_j $ est une fraction de $ A_i $ **. De plus, comme vous pouvez le voir dans cet article, vous pouvez énumérer les fractions avec $ O (\ log {A_i}) $. Par conséquent, il est possible d'énumérer les fractions pour chaque $ A_i $ et de déterminer que les propriétés de l'énoncé du problème ne sont pas satisfaites si les fractions sont incluses dans la séquence $ A $.

Comme note supplémentaire, quand j'ai regardé le commentaire de M. Maspy, j'ai pensé qu'il était vrai qu'il était écrit que ** il est plus facile de trouver des multiples que des fractions dans l'ordre des relations **. Je veux l'utiliser à partir de maintenant.

D.cc


//Comprendre(Ordre alphabétique)
#include<algorithm>//sort,Recherche de bisection,Tel
#include<bitset>//Jeu de bits de longueur fixe
#include<cmath>//pow,journal etc.
#include<complex>//Nombre complexe
#include<deque>//File d'attente d'accès double
#include<functional>//trier plus
#include<iomanip>//setprecision(Erreur de sortie en virgule flottante)
#include<iostream>//Entrée sortie
#include<iterator>//Régler l'opération(Ensemble de produits,Ensemble de somme,Ensemble de différences, etc.)
#include<map>//map(dictionnaire)
#include<numeric>//iota(Génération d'une chaîne entière),pgcd et lcm(c++17)
#include<queue>//queue
#include<set>//ensemble
#include<stack>//empiler
#include<string>//Chaîne
#include<unordered_map>//Carte avec itérateur mais sans ordre
#include<unordered_set>//Il y a un itérateur mais l'ordre n'est pas maintenu défini
#include<utility>//pair
#include<vector>//Tableau de longueur variable

using namespace std;
typedef long long ll;

//macro
//pour la relation de boucle
//L'argument est(Variables dans la boucle,Amplitude de mouvement)Ou(Variables dans la boucle,Premier numéro,Nombre d'extrémités)、のどちらOu
//Les variables de boucle sans D sont incrémentées de 1 et les variables de boucle avec D sont décrémentées de 1.
#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=(ll)(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=(ll)(b);i--)
//x est un conteneur tel que vector
#define ALL(x) (x).begin(),(x).end() //Je souhaite omettre des arguments tels que le tri
#define SIZE(x) ((ll)(x).size()) //taille à la taille_Changement de t à ll
#define MAX(x) *max_element(ALL(x)) //Trouvez la valeur maximale
#define MIN(x) *min_element(ALL(x)) //Trouvez la valeur minimale
//constant
#define INF 1000000000000 //10^12:Valeur extrêmement élevée,∞
#define MOD 1000000007 //10^9+7:Droit commun
#define MAXR 100000 //10^5:Portée maximale de la baie(Utilisé pour l'énumération des nombres premiers, etc.)
//Abréviation
#define PB push_back //Insérer dans le vecteur
#define MP make_pair //constructeur de paires
#define F first //Le premier élément de paire
#define S second //Le deuxième élément de paire

vector<ll> make_divisors(ll n){
    vector<ll> divisors;
    //cout << 1 << endl;
    FOR(i,1,ll(sqrt(n))){
        if(n%i==0){
            divisors.PB(i);
            if(i!=ll(n/i))divisors.PB(ll(n/i));
        }
    }
    return divisors;
}

signed main(){
    ll n;cin >> n;
    map<ll,ll> a;
    REP(i,n){
        ll x;cin >> x;
        a[x]+=1;
    }
    ll ans=0;
    for(auto i=a.begin();i!=a.end();i++){
        vector<ll> div=make_divisors(i->F);
        //cout << 1 << endl;
        ll f=true;
        REP(j,SIZE(div)){
            if((a.find(div[j])!=a.end() and div[j]!=(i->F))or(div[j]==(i->F) and (i->S)>1)){
                f=false;
                break;
            }
        }
        if(f)ans++;
    }
    cout << ans << endl;
}

E problème

Le multiset que j'ai fait la semaine dernière est sorti, mais je n'ai pas pu le résoudre à cause d'un bug dans l'implémentation ...

Tout d'abord, ** vous devez stocker le tout-petit avec le taux le plus élevé dans chaque jardin **, alors préparez un récipient pour le stocker (youjitati). De plus, ** le bébé à taux le plus élevé dans chaque jardin doit également être stocké dans un conteneur ** (youtien), mais ** les éléments yojitati et yotien peuvent changer en fonction du changement de jardin **, donc seul le bébé à taux le plus élevé Au lieu de **, vous devez stocker à la fois youjitati et youtien sous forme de conteneurs triés **.

Ici, ** C ++ set, multiset ** sont disponibles sous forme de ** conteneurs ** qui peuvent être ajoutés ou supprimés à grande vitesse tout en conservant l'état trié ($ O (\ log {n}) $) (Python). Il y a aussi une file d'attente en tas, mais il me semble que c'est difficile à utiliser personnellement, contrairement à mon intuition.) De plus, ici, j'ai décidé d'utiliser un multiset qui stocke le taux et le nombre du bébé par paire pour distinguer les nourrissons avec le même taux, mais comme il peut être distingué par appariement, le résultat est le même pour les ensembles au lieu du multiset Vous pouvez écrire un programme comme celui-ci.

Par conséquent, si vous organisez ce qui précède, youjitati enregistre le taux de nourrissons le plus élevé dans chaque jardin d'enfants dans la paire <taux infantile, nombre infantile> dans l'ordre croissant avec multiset <paire <ll, ll >>, et youtien Enregistre les taux de chaque enfant de la maternelle dans l'ordre croissant avec vector <multiset <pair <ll, ll >>>.

Envisagez de traiter chaque requête sous celle-ci. Ici, nous envisagerons de transférer l'enfant C de la maternelle E à la maternelle D, mais ** la maternelle E à laquelle appartient l'enfant C ne peut pas être comprise à partir des conteneurs youjitati et youtien mentionnés précédemment **. Par conséquent, enregistrez simplement ** dans quel jardin d'enfants se trouve chaque enfant ** dans vector <ll> (doko). Sur cette base, pensons au traitement des requêtes avec des diagrammes.

IMG_0417.JPG

Tout d'abord, considérons le cas où vous avez suffisamment de bambins. Ici, il est facile de comprendre s'il est divisé en ** étapes , et il peut être divisé en trois étapes. ( Je n'ai pas pu organiser la production jusqu'à présent . Je pense que je dois gagner en confiance car je peux le résoudre si je me calme.) ① effacer de youjitati Tout d'abord, il est nécessaire d'effacer une fois le taux maximum des nourrissons de la maternelle D et de la maternelle E stockés dans youjitati car les éléments à stocker dans youjitati peuvent changer lors du déplacement du bébé C. Ici, le taux maximum des nourrissons de la maternelle D et de la maternelle E peut être obtenu dans l'itérateur comme --youtien [D] .end (), --youtien [E] .end (). ( C'est rafraîchissant de penser que vous devriez vous échapper une fois **.) ② Mouvement de l'enfant C À la fin de ①, déplacez le bébé C de la maternelle E à la maternelle D. À ce stade, lorsque vous recherchez l'élément de l'enfant C, vous devez rechercher par <taux infantile, nombre enfant>, et ** le taux infantile ne peut pas être obtenu tel quel **, donc chaque taux infantile est vecteur. Enregistrez-le dans <ll> (tikara). Cela permet à l'opération de déplacement de l'enfant C d'être facilement exprimée en effaçant de youtien [E] et en l'insérant dans youtien [D]. ③ insérer dans youjitati J'ai effacé de youjitati au stade de ① plus tôt, mais cette fois, il est nécessaire de réinsérer. Ce n'est pas difficile. Comme dans le cas de ①, vous pouvez obtenir le taux maximum de nourrissons à la maternelle D et à la maternelle E avec --youtien [D] .end (), --youtien [E] .end (), alors insérez-les. C'est bon.

De plus, c'est ** s'il y a suffisamment de tout-petits dans youtien , et qu'il n'y a peut-être pas assez de tout-petits à effacer. Dans ce cas, il est bon de diviser le cas comme indiqué dans le code ci-dessous, mais si la taille de ** youtien [E] et youutien [D] est 0, vous pouvez simplement ne pas opérer ** J'ai réalisé plus tard que ( la simplification de tels problèmes est très importante **).

Répétez l'opération ci-dessus pour chaque requête, obtenez le plus petit élément avec youjitati avec youjitati.begin () et affichez-le.

E.cc


//Comprendre(Ordre alphabétique)
#include<algorithm>//sort,Recherche de bisection,Tel
#include<bitset>//Jeu de bits de longueur fixe
#include<cmath>//pow,journal etc.
#include<complex>//Nombre complexe
#include<deque>//File d'attente d'accès double
#include<functional>//trier plus
#include<iomanip>//setprecision(Erreur de sortie en virgule flottante)
#include<iostream>//Entrée sortie
#include<iterator>//Régler l'opération(Ensemble de produits,Ensemble de somme,Ensemble de différences, etc.)
#include<map>//map(dictionnaire)
#include<numeric>//iota(Génération d'une chaîne entière),pgcd et lcm(c++17)
#include<queue>//queue
#include<set>//ensemble
#include<stack>//empiler
#include<string>//Chaîne
#include<unordered_map>//Carte avec itérateur mais sans ordre
#include<unordered_set>//Il y a un itérateur mais l'ordre n'est pas maintenu défini
#include<utility>//pair
#include<vector>//Tableau de longueur variable

using namespace std;
typedef long long ll;

//macro
//pour la relation de boucle
//L'argument est(Variables dans la boucle,Amplitude de mouvement)Ou(Variables dans la boucle,Premier numéro,Nombre d'extrémités)、のどちらOu
//Les variables de boucle sans D sont incrémentées de 1 et les variables de boucle avec D sont décrémentées de 1.
#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=(ll)(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=(ll)(b);i--)
//x est un conteneur tel que vector
#define ALL(x) (x).begin(),(x).end() //Je souhaite omettre des arguments tels que le tri
#define SIZE(x) ((ll)(x).size()) //taille à la taille_Changement de t à ll
#define MAX(x) *max_element(ALL(x)) //Trouvez la valeur maximale
#define MIN(x) *min_element(ALL(x)) //Trouvez la valeur minimale
//constant
#define INF 1000000000000 //10^12:Valeur extrêmement élevée,∞
#define MOD 1000000007 //10^9+7:Droit commun
#define MAXR 100000 //10^5:Portée maximale de la baie(Utilisé pour l'énumération des nombres premiers, etc.)
//Abréviation
#define PB push_back //Insérer dans le vecteur
#define MP make_pair //constructeur de paires
#define F first //Le premier élément de paire
#define S second //Le deuxième élément de paire


signed main(){
    //Code pour accélérer la saisie
    //ios::sync_with_stdio(false);
    //cin.tie(nullptr);
    ll f=2*pow(10,5);
    ll n,q;cin >> n >> q;
    vector<multiset<pair<ll,ll>>> youtien(f);
    vector<ll> doko(n);
    vector<ll> tikara(n);
    REP(i,n){
        ll a,b;cin >> a >> b;b--;
        youtien[b].insert(MP(a,i));
        doko[i]=b;
        tikara[i]=a;
    }
    multiset<pair<ll,ll>> youjitati;
    REP(i,f){
        if(!(youtien[i].empty())){
            youjitati.insert(*(--youtien[i].end()));
        }
    }
    
    REP(i,q){
        ll c,d;cin >> c >> d;c--;d--;
        if(youtien[d].size()>0 and youtien[doko[c]].size()>1){
            youjitati.erase(*(--youtien[d].end()));
            youjitati.erase(*(--youtien[doko[c]].end()));
            youtien[d].insert(MP(tikara[c],c));
            youtien[doko[c]].erase(MP(tikara[c],c));
            youjitati.insert(*(--youtien[d].end()));
            youjitati.insert(*(--youtien[doko[c]].end()));
            doko[c]=d;
        }else if(youtien[d].size()==0 and youtien[doko[c]].size()>1){
            youjitati.erase(*(--youtien[doko[c]].end()));
            youtien[d].insert(MP(tikara[c],c));
            youtien[doko[c]].erase(MP(tikara[c],c));
            youjitati.insert(*(--youtien[d].end()));
            youjitati.insert(*(--youtien[doko[c]].end()));
            doko[c]=d;
        }else if(youtien[d].size()>0 and youtien[doko[c]].size()==1){
            youjitati.erase(*(--youtien[doko[c]].end()));
            youjitati.erase(*(--youtien[d].end()));
            youtien[d].insert(MP(tikara[c],c));
            youtien[doko[c]].erase(MP(tikara[c],c));
            youjitati.insert(*(--youtien[d].end()));
            doko[c]=d;
        }else{
            youjitati.erase(*(--youtien[doko[c]].end()));
            youtien[d].insert(MP(tikara[c],c));
            youtien[doko[c]].erase(MP(tikara[c],c));
            youjitati.insert(*(--youtien[d].end()));
            doko[c]=d;
        }
        
        cout << (youjitati.begin())->F << endl;
    }
}

Problème F

Je peux penser à BFS et DFS ** car il n'y a pas ** de recherche et de pondération sur les carrés du nombre de $ H \ fois W \ leqq 10 ^ 6 $. De plus, comme c'est le nombre minimum de coups, je vais chercher avec BFS **.

Tout d'abord, considérez tous les candidats possibles pour la prochaine masse à tracer par chaque récursif. En d'autres termes, considérez les rues 4K qui avancent de K carrés dans quatre directions, vers le haut, le bas, la gauche et la droite, ce qui peut être le carré suivant (cependant, dans le cas de @ square, vous ne pouvez pas aller au-delà). Cependant, si vous recherchez tout cela, vous constaterez que vous cherchez trop ** (même si vous ne savez pas que vous cherchez trop, vous le remarquerez lorsque vous TLE). Par conséquent, vous devez considérer ** la condition de masse minimale ** pour une recherche nécessaire et suffisante.

Ici, quand je pense réellement à la recherche précédente dans mon esprit, j'ai implémenté BFS, qui est le TLE, par la méthode ** de sauter les cellules déjà recherchées et de suivre les cellules K **. J'ai senti qu'il y avait un gaspillage en termes de re-recherche des carrés qui avaient déjà été fouillés **. En d'autres termes, puisqu'il est possible de rechercher du carré déjà recherché à K carrés dans quatre directions, les carrés déjà recherchés ont déjà été recherchés. Par conséquent, j'ai considéré que s'il y a une cellule qui a déjà été recherchée en plus de la cellule de @, la recherche après cela se terminera. Ceci est illustré ci-dessous.

Cependant, tel quel, il n'est pas possible de considérer les carrés qui ont été recherchés mais la recherche au-delà de ce carré n'a pas commencé. On peut dire que ces cellules sont des ** cellules de même profondeur **, et s'il y a de telles cellules, la recherche se poursuivra. Ceci est illustré ci-dessous.

Compte tenu de ce qui précède, vous pouvez facilement l'implémenter en le considérant comme un type légèrement différent de BFS, et le code sera le suivant.

F.py


import sys
inf=1000002
sys.setrecursionlimit(inf)
from collections import deque
h,w,k=map(int,input().split())
x1,y1,x2,y2=map(int,input().split())
c=[input() for i in range(h)]
dp=[[inf if c[i][j]=="." else -1 for j in range(w)] for i in range(h)]
now=deque([[x1-1,y1-1]])
dp[x1-1][y1-1]=0
def bfs(d):
    global dp,now
    l=len(now)
    dp_sub=deque()
    cand=set()
    for i in range(l):
        x,y=now.popleft()
        for j in range(1,min(k+1,w-y)):
            if dp[x][y+j]==inf:
                dp_sub+=[[x,y+j,d]]
                cand.add((x,y+j))
            else:
                break
        for j in range(1,min(k+1,y+1)):
            if dp[x][y-j]==inf:
                dp_sub+=[[x,y-j,d]]
                cand.add((x,y-j))
            else:
                break
        for j in range(1,min(k+1,h-x)):
            if dp[x+j][y]==inf:
                dp_sub+=[[x+j,y,d]]
                cand.add((x+j,y))
            else:
                break
        for j in range(1,min(k+1,x+1)):
            if dp[x-j][y]==inf:
                dp_sub+=[[x-j,y,d]]
                cand.add((x-j,y))
            else:
                break
    while dp_sub!=deque([]):
        e=dp_sub.popleft()
        dp[e[0]][e[1]]=e[2]
    for i in cand:
        now+=[i]
    if l!=0:bfs(d+1)
bfs(1)
print(dp[x2-1][y2-1] if dp[x2-1][y2-1]!=inf else -1)

answerF.cc


//Comprendre(Ordre alphabétique)
#include<algorithm>//sort,Recherche de bisection,Tel
#include<bitset>//Jeu de bits de longueur fixe
#include<cmath>//pow,journal etc.
#include<complex>//Nombre complexe
#include<deque>//File d'attente d'accès double
#include<functional>//trier plus
#include<iomanip>//setprecision(Erreur de sortie en virgule flottante)
#include<iostream>//Entrée sortie
#include<iterator>//Régler l'opération(Ensemble de produits,Ensemble de somme,Ensemble de différences, etc.)
#include<map>//map(dictionnaire)
#include<numeric>//iota(Génération d'une chaîne entière),pgcd et lcm(c++17)
#include<queue>//queue
#include<set>//ensemble
#include<stack>//empiler
#include<string>//Chaîne
#include<unordered_map>//Carte avec itérateur mais sans ordre
#include<unordered_set>//Il y a un itérateur mais l'ordre n'est pas maintenu défini
#include<utility>//pair
#include<vector>//Tableau de longueur variable

using namespace std;
typedef long long ll;

//macro
//pour la relation de boucle
//L'argument est(Variables dans la boucle,Amplitude de mouvement)Ou(Variables dans la boucle,Premier numéro,Nombre d'extrémités)、のどちらOu
//Les variables de boucle sans D sont incrémentées de 1 et les variables de boucle avec D sont décrémentées de 1.
#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=(ll)(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=(ll)(b);i--)
//x est un conteneur tel que vector
#define ALL(x) (x).begin(),(x).end() //Je souhaite omettre des arguments tels que le tri
#define SIZE(x) ((ll)(x).size()) //taille à la taille_Changement de t à ll
#define MAX(x) *max_element(ALL(x)) //Trouvez la valeur maximale
#define MIN(x) *min_element(ALL(x)) //Trouvez la valeur minimale
//constant
#define INF 1000000000000 //10^12:Valeur extrêmement élevée,∞
#define MOD 1000000007 //10^9+7:Droit commun
#define MAXR 100000 //10^5:Portée maximale de la baie(Utilisé pour l'énumération des nombres premiers, etc.)
//Abréviation
#define PB push_back //Insérer dans le vecteur
#define MP make_pair //constructeur de paires
#define PF pop_front
#define F first //Le premier élément de paire
#define S second //Le deuxième élément de paire

ll h,w,k;
vector<vector<ll>> dp;
deque<pair<ll,ll>> now;



void bfs(ll d){
    ll l=SIZE(now);
    if(l==0){
        return;
    }
    deque<vector<ll>> dp_sub;
    set<pair<ll,ll>> cand;
    REP(i,l){
        ll x,y;x=now.front().F;y=now.front().S;now.PF();
        FOR(j,1,min(k,w-y-1)){
            if(dp[x][y+j]==INF){
                dp_sub.PB({x,y+j,d});
                //dp[x][y+j]=d;
                cand.insert(MP(x,y+j));
                //now.PB(MP(x,y+j));
            }else{
                break;
            }
            //if(dp[x][y+j]==-1)break;
        }
        FOR(j,1,min(k,y)){
            if(dp[x][y-j]==INF){
                dp_sub.PB({x,y-j,d});
                //dp[x][y-j]=d;
                cand.insert(MP(x,y-j));
                //now.PB(MP(x,y-j));
            }else{
                break;
            }
            //if(dp[x][y-j]==-1)break;
        }
        FOR(j,1,min(k,h-x-1)){
            if(dp[x+j][y]==INF){
                dp_sub.PB({x+j,y,d});
                //dp[x+j][y]=d;
                cand.insert(MP(x+j,y));
                //now.PB(MP(x+j,y));
            }else{
                break;
            }
            //if(dp[x+j][y]==-1)break;
        }
        FOR(j,1,min(k,x)){
            if(dp[x-j][y]==INF){
                dp_sub.PB({x-j,y,d});
                //dp[x-j][y]=d;
                cand.insert(MP(x-j,y));
                //now.PB(MP(x-j,y));
            }else{
                break;
            }
            //if(dp[x-j][y]==-1)break;
        }
    }
    while(!dp_sub.empty()){
        vector<ll> d=dp_sub.front();
        dp[d[0]][d[1]]=d[2];
        dp_sub.PF();
    }
    for(auto i=cand.begin();i!=cand.end();i++){
        now.PB(*i);
    }
    bfs(d+1);
}
signed main(){
    //Code pour accélérer la saisie
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> h >> w >>k;
    ll x1,y1,x2,y2;cin >> x1 >> y1 >> x2 >> y2;
    vector<string> c(h);REP(i,h)cin >> c[i];
    dp.resize(h);
    REP(i,h){
        REP(j,w){
            if(c[i][j]=='.')dp[i].PB(INF);
            else dp[i].PB(-1); 
        }
    }
    now.PB(MP(x1-1,y1-1));
    dp[x1-1][y1-1]=0;
    bfs(1);
    if(dp[x2-1][y2-1]!=INF) cout << dp[x2-1][y2-1] << endl;
    else cout << -1 << endl;
}

Recommended Posts

Critique du concours AtCoder pour débutant 166
AtCoder Débutant Contest 167 Évaluation
Critique du concours AtCoder
AtCoder Débutant Contest 169 Évaluation
Critique du concours AtCoder Débutant 181
AtCoder Débutant Contest 171 Critique
Critique du concours AtCoder pour débutant 182
Critique du concours AtCoder Débutant 180
Critique du concours AtCoder pour débutant 177
AtCoder Débutant Contest 168 Critique
Critique du concours AtCoder pour débutant 172
Critique du concours AtCoder
AtCoder Débutant Contest 175 Critique
Critique du concours AtCoder
Critique du concours AtCoder Beginner Contest 153
Critique du concours AtCoder pour débutant 156
AtCoder Débutant Contest 161 Critique
AtCoder Débutant Contest 170 Critique
Critique du concours AtCoder
AtCoder Débutant Contest 173 Critique
AtCoder Débutant Contest 155 Critique
AtCoder Débutant Contest 162 Évaluation
Concours AtCoder Débutant 179
Concours AtCoder Débutant 180
Concours AtCoder Débutant 173
Concours Atcoder Débutant 153
AtCoder Beginner Contest 066 Revoir les questions précédentes
Concours AtCoder Débutant 181 Remarque
AtCoder Grand Contest 041 Critique
Revue du concours régulier AtCoder 105
Concours AtCoder Débutant 182 Remarque
AtCoder Grand Contest 048 Critique
Concours AtCoder pour débutants 156 WriteUp
AtCoder Grand Contest 045 Critique
AtCoder Grand Contest 044 Critique
Concours AtCoder pour débutants 167
AtCoder Regular Contest 106 Évaluation
Concours AtCoder Débutant 184 Remarque
AtCoder Grand Contest 046 Critique
Revue du concours régulier AtCoder 104
AtCoder Beginner Contest 102 Revue des questions précédentes
AtCoder Beginner Contest 072 Revue des questions précédentes
AtCoder Beginner Contest 085 Revue des questions précédentes
AtCoder Beginner Contest 113 Revue des questions précédentes
AtCoder Beginner Contest 074 Revue des questions précédentes
AtCoder Beginner Contest 051 Revue des questions précédentes
AtCoder Beginner Contest 127 Revue des questions précédentes
AtCoder Beginner Contest 119 Revue des questions précédentes
AtCoder Beginner Contest 151 Revue des questions précédentes
AtCoder Beginner Contest 075 Revue des questions précédentes
AtCoder Beginner Contest 054 Revue des questions précédentes
AtCoder Beginner Contest 110 Revue des questions précédentes
AtCoder Beginner Contest 117 Revue des questions précédentes
AtCoder Beginner Contest 070 Revue des questions précédentes
AtCoder Beginner Contest 105 Revue des questions précédentes
AtCoder Beginner Contest 112 Revue des questions précédentes
AtCoder Beginner Contest 076 Revue des questions précédentes
AtCoder Beginner Contest 069 Revue des questions précédentes