Submission #824070

#TimeUsernameProblemLanguageResultExecution timeMemory
824070lprochniakJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
259 ms231992 KiB
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long

const int max_ans = 5000000;
const int maxN = 30005;
const int maxSqrtN = 200;

int n,m;
int zero,one;
int root;
vector<int> powers[maxN];
vector<ll> q[max_ans];
bool done[maxN][maxSqrtN];
ll Encode(int building,int power){
    assert(power <= maxSqrtN);
    return building + n*power;
}
int dijkstra(){
    int curr_ans = 0;
    int best_ans = -1;
    q[0].pb(Encode(zero,0));
    while(curr_ans < max_ans){
        if(q[curr_ans].empty()){
            curr_ans++;
            continue;
        }

        ll top = q[curr_ans].back();
        q[curr_ans].pop_back();

        int building = top%n;
        int power = top/n;

        if(done[building][power]) continue;
        done[building][power] = true;

        if(building == one){
            if(best_ans == -1){
                best_ans = curr_ans;
            }
            continue;
        }

        //in building
        if(!power){
            for(ll doge:powers[building]){
                //doge in building
                if(doge<=root){
                    q[curr_ans].pb(Encode(building,doge));
                } else{
                    //other building (power>root)
                    for(int dir=-1;dir<2;dir+=2){
                        for(int jumps=1;;jumps++){
                            int pos = building + jumps*dir*doge;
                            if(pos<0 || pos>=n) break;
                            q[curr_ans+jumps].pb(Encode(pos,0));
                        }
                    }
                }
            }
        } else{
            //doge with power <= root
            
            //to building
            q[curr_ans].pb(Encode(building,0));

            //to other doge
            int pos = building + power;
            if(pos<n) q[curr_ans+1].pb(Encode(pos,power));
            pos = building - power;
            if(pos>=0) q[curr_ans+1].pb(Encode(pos,power));
        }
    }
    return best_ans;
}
int main(){
    cin>>n>>m;
    root = (int)sqrt(n);
    for(int i=0;i<m;i++){
        int building,power;
        cin>>building>>power;
        powers[building].pb(power);

        if(i==0) zero = building;
        if(i==1) one = building;
    }
    cout<<dijkstra();
    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...