Submission #109925

#TimeUsernameProblemLanguageResultExecution timeMemory
109925SaboonJakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1069 ms233436 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxn = 30000 + 10;
const int inf = 1e9;
const int T = 120;

int b[maxn], p[maxn], dp[maxn * T];
int n, m;
vector<pair<int, int> > g[maxn * T];

int id(int v, int x){
	return v * T + x;
}

void dijkstra(int v){
	for (int i = 0; i < n * T; i++)
		dp[i] = inf;
	dp[v] = 0;
	set<pair<int, int> > s;
	for (int i = 0; i < n * T; i++)
		s.insert({dp[i], i});
	while (!s.empty()){
		int v = (*s.begin()).second;
		s.erase(s.begin());
		for (auto edge : g[v]){
			int u = edge.first, w = edge.second;
			if (dp[u] > dp[v] + w){
				s.erase({dp[u], u});
				dp[u] = dp[v] + w;
				s.insert({dp[u], u});
			}
		}
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin >> n >> m;
	for (int i = 0; i < m; i++){
		cin >> b[i] >> p[i];
		if (p[i] < T)
			g[id(b[i], 0)].push_back({id(b[i], p[i]), 0});
		else{
			for (int u = b[i] + p[i]; u < n; u += p[i])
				g[id(b[i], 0)].push_back({id(u, 0), (u - b[i]) / p[i]});
			for (int u = b[i] - p[i]; u >= 0; u -= p[i])
				g[id(b[i], 0)].push_back({id(u, 0), (b[i] - u) / p[i]});
		}
	}
	for (int i = 0; i < n; i++){
		for (int j = 1; j < T; j++){
			g[id(i, j)].push_back({id(i, 0), 0});
			if (i + j < n)
				g[id(i, j)].push_back({id(i + j, j), 1});
			if (i - j >= 0)
				g[id(i, j)].push_back({id(i - j, j), 1});
		}
	}
	dijkstra(id(b[0], 0));
	if (dp[id(b[1], 0)] == inf)
		dp[id(b[1], 0)] = -1;
	cout << dp[id(b[1], 0)] << '\n';
}
#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...