제출 #41607

#제출 시각아이디문제언어결과실행 시간메모리
41607MatheusLealVJakarta Skyscrapers (APIO15_skyscraper)C++14
100 / 100
288 ms67304 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];

unordered_set<int> pos[N];

vector<pii> grafo[N];

priority_queue<pii, vector<pii>, greater<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];

		pos[ casa[i] ].insert( 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(pos[j].count(x)) break;
			}

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

				if(pos[j].count(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...