Submission #482791

#TimeUsernameProblemLanguageResultExecution timeMemory
482791beaconmcJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
206 ms67500 KiB
#include <bits/stdc++.h>
 
typedef long long ll;
#define FOR(i, x, y) for(ll i=x; i<y; i++)
 
using namespace std;
 
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
  
#define ordered_set tree<ll, null_type,greater_equal<int>, rb_tree_tag,tree_order_statistics_node_update>
 
int n,m;
int a,b,baka,imposter,sus, countz,sussy;
 
vector<pair<int, int>> edges[30000];
set <int> stuff[30000];
 
int dists[30001];
 
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    FOR(i, 0, 30001){
        dists[i] = 2147483647;
    }
    cin >> n>>m;
    FOR(i, 0, m){
        cin >> a >> b;
        if(i==0) imposter = a;
        if (i==1) baka = a;
        stuff[a].insert(b);
    }
    FOR(k, 0, n){
        for(auto&i : stuff[k]){
            sus = k;
            sussy = i;
            countz = 0;
            while ((sus+sussy)<n){
                sus += sussy;
                countz++;
                edges[k].push_back(make_pair(sus, countz));
                if (stuff[sus].find(i) != stuff[sus].end()) break;
            }
            sus = k;
            countz = 0;
            
            while ((sus-sussy)>=0){
                sus -= sussy;
                countz++;
                edges[k].push_back(make_pair(sus, countz));
                if (stuff[sus].find(i) != stuff[sus].end()) break;
            }
        }
    }
    int src=imposter;
    
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    dists[src] = 0;
    pq.push({0, src});
 
	while (pq.size()) {
        int cdist, node;
        pair<int, int> suz = pq.top();
        cdist = suz.first; node=suz.second;
        pq.pop();
		if (cdist != dists[node]) continue;
 
		for (auto& i : edges[node]) {
			if (cdist+i.second < dists[i.first]) {
				pq.push({dists[i.first] = cdist+i.second, i.first});
			}
		}
	}
    if (dists[baka] != 2147483647){
        cout << dists[baka];
    }else{
        cout << -1;
    }
    
}
#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...