Submission #623652

# Submission time Handle Problem Language Result Execution time Memory
623652 2022-08-06T08:37:30 Z valerikk Escape Route (JOI21_escape_route) C++17
35 / 100
9000 ms 142060 KB
#include "escape_route.h"
#include <algorithm>
#include <cassert>
#include <limits>

const long long INF = 1e18;

std::vector<long long> calculate_necessary_time(
	int N, int M, long long S, int Q, std::vector<int> A, std::vector<int> B,
	std::vector<long long> L, std::vector<long long> C, std::vector<int> U,
	std::vector<int> V, std::vector<long long> T) {

	std::vector<long long> answer(Q, INF);

	std::vector<std::vector<long long>> dists0(N);
	for (int start = 0; start < N; ++start) {
		std::vector<std::vector<long long>> l(N, std::vector<long long>(N, -1));
		std::vector<std::vector<long long>> c(N, std::vector<long long>(N, -1));
		for (int i = 0; i < M; ++i) {
			l[A[i]][B[i]] = l[B[i]][A[i]] = L[i];
			c[A[i]][B[i]] = c[B[i]][A[i]] = C[i];	
		}

		std::vector<long long> dist(N, INF);
		std::vector<bool> used(N, false);
		dist[start] = 0;
		for (int it = 0; it < N; ++it) {
			int u = -1;
			for (int v = 0; v < N; ++v) {
				if (!used[v] && (u == -1 || dist[v] < dist[u])) {
					u = v;
				}
			}
			assert(dist[u] != INF);
			used[u] = true;
			long long rem = dist[u] % S;
			for (int v = 0; v < N; ++v) {
				if (!used[v] && l[u][v] != -1) {
					long long new_dist = dist[u] + l[u][v];
					if (rem + l[u][v] > c[u][v]) {
						new_dist = dist[u] + S - rem + l[u][v];
					}
					dist[v] = std::min(dist[v], new_dist);
				}
			}
		}
		dists0[start] = dist;
	}

	for (int start = 0; start < N; ++start) {
		std::vector<std::vector<long long>> l(N, std::vector<long long>(N, -1));
		std::vector<std::vector<long long>> c(N, std::vector<long long>(N, -1));
		for (int i = 0; i < M; ++i) {
			l[A[i]][B[i]] = l[B[i]][A[i]] = L[i];
			c[A[i]][B[i]] = c[B[i]][A[i]] = C[i];	
		}

		std::vector<long long> stops = {0};
		std::vector<std::vector<long long>> dists;
		while (true) {
			std::vector<long long> dist(N, INF);
			std::vector<bool> used(N, false);
			dist[start] = 0;
			for (int it = 0; it < N; ++it) {
				int u = -1;
				for (int v = 0; v < N; ++v) {
					if (!used[v] && (u == -1 || dist[v] < dist[u])) {
						u = v;
					}
				}
				if (dist[u] == INF) break;
				used[u] = true;
				for (int v = 0; v < N; ++v) {
					if (!used[v] && l[u][v] != -1) {
						dist[v] = std::min(dist[v], dist[u] + l[u][v]);
					}
				}
			}
			long long stop = INF;
			for (int u = 0; u < N; ++u) {
				for (int v = 0; v < N; ++v) {
					if (l[u][v] != -1) {
						stop = std::min(stop, std::max(stops.back(), c[u][v] - dist[u] - l[u][v] + 1));
					}
				}
			}
			stops.push_back(stop);
			dists.push_back(dist);
			for (int u = 0; u < N; ++u) {
				for (int v = 0; v < N; ++v) {
					if (l[u][v] != -1 && std::max(stops.back(), c[u][v] - dist[u] - l[u][v] + 1) == stop) {
						l[u][v] = -1;
						c[u][v] = -1;
					}
				}
			}
			if (stop == INF) break;
		}

		for (int i = 0; i < Q; ++i) {
			if (U[i] == start) {
				int pos = std::upper_bound(begin(stops), end(stops), T[i]) - begin(stops);
				answer[i] = std::min(answer[i], dists[pos - 1][V[i]]);
				for (int W = 0; W < N; ++W) {
					if (dists[pos - 1][W] != INF) {
						answer[i] = std::min(answer[i], S - T[i] + dists0[W][V[i]]); 
					}
				}
			}
		}
	}

	return answer;
}
# Verdict Execution time Memory Grader output
1 Correct 25 ms 64980 KB Output is correct
2 Correct 63 ms 64976 KB Output is correct
3 Correct 1018 ms 64976 KB Output is correct
4 Correct 28 ms 64984 KB Output is correct
5 Correct 28 ms 64988 KB Output is correct
6 Correct 29 ms 64976 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1641 ms 117648 KB Output is correct
2 Correct 1648 ms 126640 KB Output is correct
3 Correct 1592 ms 117592 KB Output is correct
4 Correct 1829 ms 129756 KB Output is correct
5 Correct 1780 ms 129876 KB Output is correct
6 Correct 26 ms 65000 KB Output is correct
7 Correct 1625 ms 117600 KB Output is correct
8 Correct 502 ms 142060 KB Output is correct
9 Correct 1685 ms 117536 KB Output is correct
10 Correct 1765 ms 129312 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 64980 KB Output is correct
2 Correct 63 ms 64976 KB Output is correct
3 Correct 1018 ms 64976 KB Output is correct
4 Correct 28 ms 64984 KB Output is correct
5 Correct 28 ms 64988 KB Output is correct
6 Correct 29 ms 64976 KB Output is correct
7 Correct 1641 ms 117648 KB Output is correct
8 Correct 1648 ms 126640 KB Output is correct
9 Correct 1592 ms 117592 KB Output is correct
10 Correct 1829 ms 129756 KB Output is correct
11 Correct 1780 ms 129876 KB Output is correct
12 Correct 26 ms 65000 KB Output is correct
13 Correct 1625 ms 117600 KB Output is correct
14 Correct 502 ms 142060 KB Output is correct
15 Correct 1685 ms 117536 KB Output is correct
16 Correct 1765 ms 129312 KB Output is correct
17 Correct 2008 ms 117540 KB Output is correct
18 Correct 1869 ms 117588 KB Output is correct
19 Correct 1920 ms 128116 KB Output is correct
20 Correct 1916 ms 117584 KB Output is correct
21 Correct 2032 ms 129992 KB Output is correct
22 Correct 2047 ms 129780 KB Output is correct
23 Correct 1928 ms 117452 KB Output is correct
24 Correct 761 ms 140756 KB Output is correct
25 Correct 1992 ms 116084 KB Output is correct
26 Correct 2037 ms 126872 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 25 ms 64980 KB Output is correct
2 Correct 63 ms 64976 KB Output is correct
3 Correct 1018 ms 64976 KB Output is correct
4 Correct 28 ms 64984 KB Output is correct
5 Correct 28 ms 64988 KB Output is correct
6 Correct 29 ms 64976 KB Output is correct
7 Correct 1641 ms 117648 KB Output is correct
8 Correct 1648 ms 126640 KB Output is correct
9 Correct 1592 ms 117592 KB Output is correct
10 Correct 1829 ms 129756 KB Output is correct
11 Correct 1780 ms 129876 KB Output is correct
12 Correct 26 ms 65000 KB Output is correct
13 Correct 1625 ms 117600 KB Output is correct
14 Correct 502 ms 142060 KB Output is correct
15 Correct 1685 ms 117536 KB Output is correct
16 Correct 1765 ms 129312 KB Output is correct
17 Correct 2008 ms 117540 KB Output is correct
18 Correct 1869 ms 117588 KB Output is correct
19 Correct 1920 ms 128116 KB Output is correct
20 Correct 1916 ms 117584 KB Output is correct
21 Correct 2032 ms 129992 KB Output is correct
22 Correct 2047 ms 129780 KB Output is correct
23 Correct 1928 ms 117452 KB Output is correct
24 Correct 761 ms 140756 KB Output is correct
25 Correct 1992 ms 116084 KB Output is correct
26 Correct 2037 ms 126872 KB Output is correct
27 Execution timed out 9070 ms 113484 KB Time limit exceeded
28 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 25 ms 64980 KB Output is correct
2 Correct 63 ms 64976 KB Output is correct
3 Correct 1018 ms 64976 KB Output is correct
4 Correct 28 ms 64984 KB Output is correct
5 Correct 28 ms 64988 KB Output is correct
6 Correct 29 ms 64976 KB Output is correct
7 Correct 1641 ms 117648 KB Output is correct
8 Correct 1648 ms 126640 KB Output is correct
9 Correct 1592 ms 117592 KB Output is correct
10 Correct 1829 ms 129756 KB Output is correct
11 Correct 1780 ms 129876 KB Output is correct
12 Correct 26 ms 65000 KB Output is correct
13 Correct 1625 ms 117600 KB Output is correct
14 Correct 502 ms 142060 KB Output is correct
15 Correct 1685 ms 117536 KB Output is correct
16 Correct 1765 ms 129312 KB Output is correct
17 Correct 2008 ms 117540 KB Output is correct
18 Correct 1869 ms 117588 KB Output is correct
19 Correct 1920 ms 128116 KB Output is correct
20 Correct 1916 ms 117584 KB Output is correct
21 Correct 2032 ms 129992 KB Output is correct
22 Correct 2047 ms 129780 KB Output is correct
23 Correct 1928 ms 117452 KB Output is correct
24 Correct 761 ms 140756 KB Output is correct
25 Correct 1992 ms 116084 KB Output is correct
26 Correct 2037 ms 126872 KB Output is correct
27 Execution timed out 9070 ms 113484 KB Time limit exceeded
28 Halted 0 ms 0 KB -