답안 #622713

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
622713 2022-08-04T13:43:25 Z Jomnoi Sky Walking (IOI19_walk) C++17
0 / 100
4000 ms 332044 KB
#include <bits/stdc++.h>
#include "walk.h"
using namespace std;

const int MAX_N = 1e5 + 5;
const long long llINF = 1e18 + 7;

int N, M, cntNode;
int table[MAX_N][20];
map <int, set <pair <int, int>>> graph;
map <int, long long> dist;
map <int, bool> visited;
set <pair <int, int>> intersect[MAX_N];

int getMax(int l, int r) {
	int j = log2(r - l + 1);
	return max(table[l][j], table[r - (1<<j) + 1][j]);
}

int connectVertical(int i, int y) {
	auto itL = intersect[i].lower_bound(make_pair(y, -1)), itR = itL--;
	int now;
	bool newNode = false;
	if(itR != intersect[i].end() and itR->first == y) {
		now = itR->first;
	}
	else {
		now = cntNode++;
		newNode = true;
	}

	if(itR != intersect[i].end()) {
		graph[itR->second].erase(make_pair(itL->second, itR->first - itL->first));
		graph[itL->second].erase(make_pair(itR->second, itR->first - itL->first));
	}

	graph[now].emplace(itL->second, y - itL->first);
	graph[itL->second].emplace(now, y - itL->first);
	if(itR != intersect[i].end() and itR->first > y) {
		graph[now].emplace(itR->second, itR->first - y);
		graph[itR->second].emplace(now, itR->first - y);
	}

	if(newNode == true) {
		intersect[i].emplace(y, now);
	}
	return now;
}

long long min_distance(vector <int> X, vector <int> H, vector <int> Lft, vector <int> Rgh, vector <int> Y, int S, int G) {
	N = X.size(), M = Y.size(), cntNode = N;
	for(int i = 0; i < N; i++) {
		table[i][0] = H[i];
		intersect[i].emplace(0, i);
	}
	for(int j = 1; j < 20; j++) {
		for(int i = 0; i + (1<<j) - 1 < N; i++) {
			table[i][j] = max(table[i][j - 1], table[i + (1<<(j - 1))][j - 1]);
		}
	}

	for(int i = 0; i < M; i++) {
		int prv = Lft[i], nxt;
		int prv2, nxt2;
		prv2 = connectVertical(Lft[i], Y[i]);
		while(prv < Rgh[i]) {
			int l = prv + 1, r = Rgh[i];
			while(l <= r) {
				int mid = (l + r) / 2;

				if(getMax(prv + 1, mid) >= Y[i]) {
					nxt = mid;
					r = mid - 1;
				}
				else {
					l = mid + 1;
				}
			}

			nxt2 = connectVertical(nxt, Y[i]);
			graph[prv2].emplace(nxt2, X[nxt] - X[prv]);
			graph[nxt2].emplace(prv2, X[nxt] - X[prv]);
			prv = nxt, prv2 = nxt2;
		}
	}

	for(int i = 0; i < cntNode; i++) {
		dist[i] = llINF;
	}

	priority_queue <pair <long long, int>> pq;
	pq.emplace(0, S);
	dist[S] = 0;
	while(!pq.empty()) {
		auto [d, u] = pq.top();
		pq.pop();

		if(visited[u] == true) {
			continue;
		}
		visited[u] = false;

		if(u == G) {
			return dist[u];
		}
		for(auto [v, w] : graph[u]) {
			if(visited[v] == false and dist[u] + w < dist[v]) {
				dist[v] = dist[u] + w;
				pq.emplace(-dist[v], v);
			}
		}
	}
	return -1;
}

Compilation message

walk.cpp: In function 'long long int min_distance(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, int, int)':
walk.cpp:81:35: warning: 'nxt' may be used uninitialized in this function [-Wmaybe-uninitialized]
   81 |    graph[prv2].emplace(nxt2, X[nxt] - X[prv]);
      |                                   ^
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 4 ms 5020 KB Output is correct
3 Incorrect 3 ms 4948 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 2148 ms 277176 KB Output is correct
4 Execution timed out 4078 ms 332044 KB Time limit exceeded
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 508 ms 37268 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 508 ms 37268 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 4 ms 5020 KB Output is correct
3 Incorrect 3 ms 4948 KB Output isn't correct
4 Halted 0 ms 0 KB -