제출 #1026810

#제출 시각아이디문제언어결과실행 시간메모리
1026810fv3Sky Walking (IOI19_walk)C++14
10 / 100
4064 ms1048576 KiB
/*
Sky Walking
*/
#include <bits/stdc++.h>
#include "walk.h"

using namespace std;
typedef long long ll;
const ll INF = 1ll << 60ll;

struct node
{
	ll x, y; 
	ll index;
	vector<pair<int, ll>> adj;
};

struct walk
{
	int l, r, y;
	bool operator<(const walk other) const
	{
		return y < other.y;
	}
};

ll min_distance(vector<int> X, vector<int> H, vector<int> L, vector<int> R, vector<int> Y, int S, int G) 
{
	const int N = X.size();
	const int M = L.size();

	vector<walk> walks(M);
	for (int i = 0; i < M; i++)
		walks[i] = {L[i], R[i], Y[i]};
	sort(walks.begin(), walks.end());

	// Construct adjacency list
	vector<node> nodes;
	vector<int> top(N);
	for (int i = 0; i < N; i++)
	{
		nodes.push_back({X[i], 0, i, {}});
		top[i] = i; 
	}

	for (auto w : walks)
	{
		int last = -1;
		for (int i = w.l; i <= w.r; i++)
		{
			if (H[i] < w.y) continue;

			int index = nodes.size();
			node newNode = {X[i], w.y, index, {}};

			ll vdist = w.y - nodes[top[i]].y;

			nodes[top[i]].adj.push_back({index, vdist});
			newNode.adj.push_back({top[i], vdist});
			top[i] = index;

			if (last != -1)
			{
				ll hdist = X[i] - nodes[last].x;

				newNode.adj.push_back({last, hdist});
				nodes[last].adj.push_back({index, hdist});
			}
			last = index;

			nodes.push_back(newNode);
		}
	}

	priority_queue<pair<ll, int>> q;
	q.push({0ll, S});

	ll sz = nodes.size();

	vector<int> visited(sz);
	vector<ll> dist(sz, INF);
	dist[S] = 0;

	while (!q.empty())
	{
		int s = q.top().second;
		q.pop();

		if (visited[s]) continue;
		visited[s] = 1;

		for (auto n : nodes[s].adj)
		{
			if (visited[n.first]) continue;
			if (dist[s] + n.second < dist[n.first])
			{
				dist[n.first] = dist[s] + n.second;
				q.push({-dist[n.first], n.first});
			}
		}
	}

	if (dist[G] == INF)
		return -1;
	return dist[G];
}
#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...