답안 #375338

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
375338 2021-03-09T09:24:58 Z KoD Dungeon 2 (JOI16_dungeon2) C++17
100 / 100
100 ms 1516 KB
#include <bits/stdc++.h>
#include "dungeon2.h"

template <class T>
using Vec = std::vector<T>;

template <class F>
struct RecLambda: private F {
	explicit RecLambda(F &&f): F(std::forward<F>(f)) { }
	template <class... Args>
	decltype(auto) operator () (Args&&... args) const {
		return F::operator()(*this, std::forward<Args>(args)...);
	}
};

constexpr int POW3[] = { 1, 3, 9, 27, 81 };

void Inspect(int R) {
	Vec<Vec<int>> graph;
	Vec<Vec<int>> id;
	Vec<int> p_edge;
	RecLambda([&](auto dfs, const int p) -> int {
		const auto u = (int) graph.size();
		graph.push_back(Vec<int>(NumberOfRoads()));
		id.push_back(Vec<int>(NumberOfRoads()));
		p_edge.push_back(LastRoad() - 1);
		if (p != -1) {
			graph[u][p_edge[u]] = 3;
		}
		for (int i = 0; i < (int) graph[u].size(); ++i) {
			if (graph[u][i] != 0) {
				continue;
			}
			Move(i + 1, 2);
			if (Color() == 2) {
				Move(LastRoad(), 2);
				graph[u][i] = 2;
			}
			else if (Color() == 3) {
				Move(LastRoad(), 3);
				graph[u][i] = 3;
			}
			else {
				graph[u][i] = 1;
				id[u][i] = dfs(u);
			}
		}
		if (p != -1) {
			Move(p_edge[u] + 1, 3);
		}
		return u;
	})(-1);
	const auto N = (int) graph.size();
	const auto dfs = RecLambda([&](auto dfs, const int u, const int step) -> void {
		const auto write = (u / POW3[step]) % 3;
		for (int i = 0; i < (int) graph[u].size(); ++i) {
			if (graph[u][i] == 1) {
				Move(i + 1, write + 1);
				dfs(id[u][i], step);
			}
			else if (graph[u][i] == 2) {
				Move(i + 1, write + 1);
				id[u][i] += POW3[step] * (Color() - 1);
				Move(LastRoad(), Color()); 
			}
		}
		if (p_edge[u] >= 0) {
			Move(p_edge[u] + 1, write + 1);
		}
	});
	for (int i = 0; i < 5; ++i) {
		dfs(0, i);
	}
	Vec<Vec<int>> dist(N, Vec<int>(N, N));
	for (int u = 0; u < N; ++u) {
		dist[u][u] = 0;
		for (int i = 0; i < (int) graph[u].size(); ++i) {
			if (graph[u][i] <= 2) {
				const auto v = id[u][i];
				dist[u][v] = 1;
				dist[v][u] = 1;
			}
		}
	}
	for (int k = 0; k < N; ++k) {
		for (int i = 0; i < N; ++i) {
			for (int j = 0; j < N; ++j) {
				dist[i][j] = std::min(dist[i][j], dist[i][k] + dist[k][j]);
			}
		}
	}
	for (int d = 1; d <= R; ++d) {
		int ans = 0;
		for (int i = 0; i < N; ++i) {
			for (int j = 0; j < i; ++j) {
				if (dist[i][j] == d) {
					ans += 1;
				}
			}
		}
		Answer(d, ans);
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 492 KB Output is correct
2 Correct 1 ms 492 KB Output is correct
3 Correct 1 ms 492 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 492 KB Output is correct
6 Correct 1 ms 364 KB Output is correct
7 Correct 1 ms 492 KB Output is correct
8 Correct 1 ms 364 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Correct 1 ms 492 KB Output is correct
11 Correct 1 ms 492 KB Output is correct
12 Correct 1 ms 492 KB Output is correct
13 Correct 1 ms 492 KB Output is correct
14 Correct 1 ms 492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 492 KB Output is correct
3 Correct 1 ms 492 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 492 KB Output is correct
6 Correct 1 ms 492 KB Output is correct
7 Correct 1 ms 364 KB Output is correct
8 Correct 1 ms 492 KB Output is correct
9 Correct 1 ms 364 KB Output is correct
10 Correct 1 ms 492 KB Output is correct
11 Correct 1 ms 492 KB Output is correct
12 Correct 1 ms 492 KB Output is correct
13 Correct 1 ms 492 KB Output is correct
14 Correct 1 ms 492 KB Output is correct
15 Correct 1 ms 492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 876 KB Output is correct
2 Correct 14 ms 876 KB Output is correct
3 Correct 16 ms 1132 KB Output is correct
4 Correct 23 ms 1516 KB Output is correct
5 Correct 2 ms 492 KB Output is correct
6 Correct 5 ms 620 KB Output is correct
7 Correct 14 ms 876 KB Output is correct
8 Correct 14 ms 876 KB Output is correct
9 Correct 14 ms 876 KB Output is correct
10 Correct 14 ms 876 KB Output is correct
11 Correct 14 ms 876 KB Output is correct
12 Correct 14 ms 876 KB Output is correct
13 Correct 15 ms 1004 KB Output is correct
14 Correct 100 ms 876 KB Output is correct
15 Correct 14 ms 876 KB Output is correct
16 Correct 5 ms 748 KB Output is correct
17 Correct 21 ms 1516 KB Output is correct
18 Correct 23 ms 1516 KB Output is correct
19 Correct 20 ms 1388 KB Output is correct