Submission #109929

#TimeUsernameProblemLanguageResultExecution timeMemory
109929SaboonJakarta Skyscrapers (APIO15_skyscraper)C++14
57 / 100
1006 ms230788 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

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

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;
}

int 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());
		if (v == id(b[1], 0)){
			if (dp[v] == inf)
				dp[v] = -1;
			return dp[v];
		}
		if (v % T != 0){
			int i = v / T, j = v % T;
			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});
		}
		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});
			}
		}
		g[v].clear();
	}
}

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]});
		}
	}
	cout << dijkstra(id(b[0], 0)) << '\n';
}

Compilation message (stderr)

skyscraper.cpp: In function 'int dijkstra(int)':
skyscraper.cpp:51:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#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...