답안 #27180

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
27180 2017-07-09T20:58:17 Z abcdef6199 Dungeon 2 (JOI16_dungeon2) C++
0 / 100
1000 ms 1920 KB
#include "dungeon2.h"
 
#include <vector>
#include <cstdio>
 
using namespace std;
 
const int MAX_N = 250;
 
vector<int> con[MAX_N];
int id;
 
int Visit1(int rt)
{
	if (Color() != 1) {
		int n = Color();
		Move(LastRoad(), n);
		return -n;
	}
 
	int p = id++;
	int last = LastRoad() - 1;
	int deg = NumberOfRoads();
	for (int i = 0; i < deg; ++i) {
		if (i != last) {
			Move(i + 1, 2);
			int t = Visit1(p);
			if (t == -2) {
				con[p].push_back(1000);
			} else if (t == -3) {
				con[p].push_back(-1);
			} else {
				con[p].push_back(t);
			}
		} else {
			con[p].push_back(-1);
		}
	}
 
	if (rt != -1) {
		Move(last + 1, 3);
	}
	return p;
}
 
vector<int> S;
 
void Visit2(int p, int rt, int power3)
{
	int depth = S.size();
	S.push_back(p);
 
	int label = (depth / power3) % 3 + 1;
	int last = LastRoad() - 1;
	for (int i = 0; i < con[p].size(); ++i) {
		int q = con[p][i];
		if (q == -1) continue;
		if (q >= 1000) {
			Move(i + 1, label);
			con[p][i] += power3 * (Color() - 1);
			if (power3 == 1) {
				con[p][i] = S[con[p][i] - 1000];
			}
			Move(LastRoad(), Color());
		} else {
			Move(i + 1, label);
			Visit2(q, p, power3);
		}
	}
 
	S.pop_back();
	if (rt != -1) {
		Move(last + 1, 1);
	}
}
 
int wf[MAX_N][MAX_N];
int ans[MAX_N + 1];
 
void Inspect(int R)
{
	id = 0;
	Visit1(-1);
	Visit2(0, -1, 81);
	Visit2(0, -1, 27);
	Visit2(0, -1, 9);
	Visit2(0, -1, 3);
	Visit2(0, -1, 1);
 
	for (int i = 0; i < id; ++i) {
		for (int j = 0; j < id; ++j) wf[i][j] = (i == j ? 0 : (id + 1));
	}
	for (int i = 0; i < id; ++i) {
		for (int j : con[i]) if (j != -1) wf[i][j] = wf[j][i] = 1;
	}
	for (int i = 0; i < id; ++i) {
		for (int j = 0; j < id; ++j) {
			for (int k = 0; k < id; ++k) wf[j][k] = min(wf[j][k], wf[j][i] + wf[i][k]);
		}
	}
	for (int i = 1; i <= R; ++i) ans[i] = 0;
	for (int i = 0; i < id; ++i) {
		for (int j = i + 1; j < id; ++j) {
			if (1 <= wf[i][j] && wf[i][j] <= R) ++ans[wf[i][j]];
		}
	}
	for (int i = 1; i <= R; ++i) Answer(i, ans[i]);
}

Compilation message

dungeon2.cpp: In function 'void Visit2(int, int, int)':
dungeon2.cpp:55:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < con[p].size(); ++i) {
                    ^
dungeon2.cpp: In function 'void Inspect(int)':
dungeon2.cpp:94:16: warning: range-based 'for' loops only available with -std=c++11 or -std=gnu++11
   for (int j : con[i]) if (j != -1) wf[i][j] = wf[j][i] = 1;
                ^
dungeon2.cpp:94:60: warning: 'j' may be used uninitialized in this function [-Wmaybe-uninitialized]
   for (int j : con[i]) if (j != -1) wf[i][j] = wf[j][i] = 1;
                                                            ^
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1000 ms 1920 KB Execution timed out
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1000 ms 1920 KB Execution timed out
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1000 ms 1920 KB Execution timed out
2 Halted 0 ms 0 KB -