Submission #59700

#TimeUsernameProblemLanguageResultExecution timeMemory
59700liwiJakarta Skyscrapers (APIO15_skyscraper)C++11
100 / 100
767 ms16468 KiB
#include <bits/stdc++.h>

using namespace std;

int num_buildings, num_dogs, target;
int dis[30000];
unordered_set<int> buildings[30000];

int main(int argc, const char * argv[]) {
    int start = 0;
    cin>>num_buildings>>num_dogs;
    for(int i=0; i<num_dogs; i++){
        int b, p; cin>>b>>p;
        buildings[b].insert(p);
        if(i == 0)
            start = b;
        if(i == 1)
            target = b;
    }
    memset(dis,0x3f,sizeof dis); dis[start] = 0;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
    q.push({0,start});
    
    while(!q.empty()){
        int current_building = q.top().second; q.pop();
        if(current_building == target)
            continue;
        
        for(int check:buildings[current_building]){
            for(int i=1; i*check+current_building<num_buildings; i++){
                int next_building = i*check+current_building;
                if(dis[next_building] > dis[current_building]+i){
                    dis[next_building] = dis[current_building]+i;
                    q.push({dis[next_building],next_building});
                    if(binary_search(buildings[next_building].begin(),buildings[next_building].end(),check))
                       break;
                }
            }
            for(int i=1; current_building-i*check>=0; i++){
                int next_building = current_building-i*check;
                if(dis[next_building] > dis[current_building]+i){
                    dis[next_building] = dis[current_building]+i;
                    q.push({dis[next_building],next_building});
                    if(binary_search(buildings[next_building].begin(),buildings[next_building].end(),check))
                        break;
                }
            }
        }
    }
    cout<<(dis[target]==0x3f3f3f3f?-1:dis[target]);
    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...