Submission #41605

#TimeUsernameProblemLanguageResultExecution timeMemory
41605MatheusLealVJakarta Skyscrapers (APIO15_skyscraper)C++14
36 / 100
627 ms262144 KiB
#include <bits/stdc++.h>
#define N 30050
#define f first
#define s second
using namespace std;
typedef pair<int, int> pii;

int n, m, casa[N], len[N], dist[N];

vector<int> pos[N];

vector<pii> grafo[N];

priority_queue<pii> pq;

int main()
{
	ios::sync_with_stdio(false); cin.tie(0);

	cin>>m>>n;

	for(int i = 1; i <= n; i++)
	{
		cin>>casa[i]>>len[i];

		if(binary_search( pos[ casa[i] ].begin(), pos[ casa[i] ].end(), len[i]) == false) pos[ casa[i] ].push_back(len[i]);
	}

	for(int i = 0; i < m; i++)
	{
		for(auto x: pos[i])
		{
			for(int j = i + x; j < m; j += x)
			{
				grafo[i].push_back({j, (j - i)/x});

				if(binary_search(pos[j].begin(), pos[j].end(), x)) break;
			}

			for(int j = i - x; j >= 0; j -= x)
			{
				grafo[i].push_back({j, (i - j)/x});

				if(binary_search(pos[j].begin(), pos[j].end(), x)) break;
			}
		}
	}

	for(int i = 0; i < m; i++) dist[i] = 2000000000;

	dist[ casa[1] ] = 0;

	pq.push({0, casa[1]});

	while(!pq.empty())
	{
		int x = pq.top().s, d = pq.top().f;

		pq.pop();

		if(d > dist[x]) continue;

		for(auto v: grafo[x])
		{
			if(dist[v.f] > dist[x] + v.s)
			{
				dist[v.f] = dist[x] + v.s;

				pq.push({dist[v.f], v.f});
			}
		}
	}

	cout<<(dist[casa[2]] != 2000000000 ? dist[casa[2]] : -1)<<'\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...