제출 #1184620

#제출 시각아이디문제언어결과실행 시간메모리
1184620inesfiJakarta Skyscrapers (APIO15_skyscraper)C++20
100 / 100
310 ms86640 KiB
#include<bits/stdc++.h>
using namespace std;

#define endl "\n"
//#define int long long

const int TAILLEMAXI=30*1000+2,PMAXI=175;
int dejavu[TAILLEMAXI][PMAXI]; ///endroit,P
vector<int> depart[TAILLEMAXI];
int nbvilles,nbjumpers;
vector<pair<int,int>> encours[PMAXI]; ///////// [nbcoups], pos, P

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>nbvilles>>nbjumpers;
    int posfinal;
    for (int i=0;i<nbjumpers;i++){
        int a,b;
        cin>>a>>b;
        depart[a].push_back(b);
        if (i==0){
            encours[0].push_back({a,0});
        }
        else if (i==1){
            posfinal=a;
        }
    }
    int rep=0,nbelem=1;
    while (nbelem!=0){
        for (int icase=0;icase<PMAXI;icase++){
            while ((int)encours[icase].size()!=0){
                int pos=encours[icase].back().first,P=encours[icase].back().second;
                encours[icase].pop_back();
                nbelem--;
                if (pos>=0 and pos<nbvilles and dejavu[pos][P]==0){
                    dejavu[pos][P]=1;
                    if (pos==posfinal){
                        cout<<PMAXI*rep+icase<<endl;
                        return 0;
                    }
                    if (P!=0){
                        encours[icase].push_back({pos,0});
                        encours[(icase+1)%PMAXI].push_back({pos-P,P});
                        encours[(icase+1)%PMAXI].push_back({pos+P,P});
                        nbelem+=3;
                    }
                    else {
                        for (int i:depart[pos]){
                            if (i<PMAXI){
                                encours[icase].push_back({pos,i});
                                nbelem++;
                            }
                            else {
                                int a=1;
                                while (pos-a*i>=0){
                                    encours[(icase+a)%PMAXI].push_back({pos-a*i,0});
                                    nbelem++;
                                    a++;
                                }
                                a=1;
                                while (pos+a*i<nbvilles){
                                    encours[(icase+a)%PMAXI].push_back({pos+a*i,0});
                                    nbelem++;
                                    a++;
                                }
                            }
                        }
                    }
                }
            }
        }
        rep++;
    }
    cout<<-1<<endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...