제출 #953964

#제출 시각아이디문제언어결과실행 시간메모리
953964JooDdaeJakarta Skyscrapers (APIO15_skyscraper)C++17
100 / 100
149 ms81592 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const ll INF = 1e18;

int n, m, s[30030], p[30030];
ll d[30030];
vector<array<int, 2>> v[30030];
set<int> st[30030], did[30030];
priority_queue<array<int, 2>> pq;

int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin >> n >> m;
	for(int i=0;i<m;i++) {
		cin >> s[i] >> p[i];
		st[s[i]].insert(p[i]);
	}
	for(int i=0;i<m;i++) {
		if(did[s[i]].count(p[i])) continue;
		did[s[i]].insert(p[i]);
		for(int j=1;;j++) {
			int x = s[i]-p[i]*j;
			if(x < 0) break;
			v[s[i]].push_back({x, j});
			if(st[x].count(p[i])) break;
		}
		for(int j=1;;j++) {
			int x = s[i]+p[i]*j;
			if(x >= n) break;
			v[s[i]].push_back({x, j});
			if(st[x].count(p[i])) break;
		}
	}
	fill(d, d+n, INF);
	d[s[0]] = 0, pq.push({0, s[0]});
	while(!pq.empty()) {
		auto [c, u] = pq.top(); pq.pop();
		if(-c > d[u]) continue;
		for(auto [x, y] : v[u]) if(y-c < d[x]) d[x] = y-c, pq.push({c-y, x});
	}
	cout << (d[s[1]] == INF ? -1 : d[s[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...