Submission #679733

#TimeUsernameProblemLanguageResultExecution timeMemory
679733faribourzJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
199 ms70940 KiB
// Only GOD
// believe in yourself
// Nemidam Del Be In Darde Donya!
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

#define F first
#define S second
#define pb push_back
#define all(x) x.begin(), x.end()
#define bit(x, y) ((x >> y)&1)
#define sz(x) (int)x.size()
#define kill(x) return cout << x << '\n', void()
#define KILL(x) return cout << x << '\n', 0
#define int ll

const int N = 1e5+100;
const int INF = 1e9+10;
set <int> s[N];
vector<pii> G[N];
int dis[N];
int32_t main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n, m;
	cin >> n >> m;
	int start = -1, end = -1;
	for(int i = 0; i < m; i++){
		int b, p;
		cin >> b >> p;
		s[b].insert(p);
		if(i==0)
			start = b;
		if(i==1)
			end = b;
	}
	memset(dis, 63, sizeof dis);
	for(int i = 0; i < n; i++){
		for(int u : s[i]){
			for(int j = i+u;j < n; j+= u){
				G[i].pb({j, (j-i)/u});
				if(s[j].find(u) != s[j].end()){
					break;
				}
			}
			for(int j = i - u; j >= 0; j-=u){
				G[i].pb({j, (i-j)/u});
				if(s[j].find(u) != s[j].end()){
					break;
				}
			}
		}
	}
	dis[start] = 0;
	priority_queue<pii> q;
	q.push({-dis[start], start});
	while(!q.empty()){
		int a = q.top().S;
		q.pop();
		for(auto B : G[a]){
			int v = B.F, w = B.S;
			if(dis[a] + w < dis[v]){
				dis[v] = dis[a]+w;
				q.push({-dis[v], v});
			}
		}
	}
	cout << (dis[end] > INF ? -1 : dis[end]);
}
#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...