Submission #94795

#TimeUsernameProblemLanguageResultExecution timeMemory
94795newyearTreasure (different grader from official contest) (CEOI13_treasure2)C++14
69 / 100
2 ms504 KiB
#include "treasure.h" int map[101][101], sum[4][101][101]; int mycount(int r1, int c1, int r2, int c2, int mode) { int row = r2 - r1+1, col = c2 - c1+1; if (!mode) { if (sum[mode][r2][c2]) return sum[mode][r2][c2]; sum[mode][r2][c2] = countTreasure(r1, c1, r2, c2); if (sum[mode][r2][c2] == row*col) { for (int i = r1; i <= r2; i++) for (int j = c1; j <= c2; j++) map[i][j] = 1; } return sum[mode][r2][c2]; } else if (mode == 1) { if (sum[mode][r1][c1]) return sum[mode][r1][c1]; sum[mode][r1][c1] = countTreasure(r1, c1, r2, c2); if (sum[mode][r1][c1] == row*col) { for (int i = r1; i <= r2; i++) for (int j = c1; j <= c2; j++) map[i][j] = 1; } return sum[mode][r1][c1]; } else if (mode == 2) { if (sum[mode][r1][c2]) return sum[mode][r1][c2]; sum[mode][r1][c2] = countTreasure(r1, c1, r2, c2); if (sum[mode][r1][c2] == row*col) { for (int i = r1; i <= r2; i++) for (int j = c1; j <= c2; j++) map[i][j] = 1; } return sum[mode][r1][c2]; } else { if (sum[mode][r2][c1]) return sum[mode][r2][c1]; sum[mode][r2][c1] = countTreasure(r1, c1, r2, c2); if (sum[mode][r2][c1] == row*col) { for (int i = r1; i <= r2; i++) for (int j = c1; j <= c2; j++) map[i][j] = 1; } return sum[mode][r2][c1]; } } void findTreasure(int N) { for (int i = N; i > N/2; i--) for (int j = N; j > N / 2; j--) { if (!map[i][j]) map[i][j] = mycount(1, 1, i, j, 0) - mycount(1, 1, i - 1, j, 0) - mycount(1, 1, i, j - 1, 0) + mycount(1, 1, i - 1, j - 1, 0); } for (int i = 1; i <= N / 2; i++) for (int j = 1; j <= N / 2; j++) if (!map[i][j]) map[i][j] = mycount(i, j, N, N, 1) - mycount(i, j + 1, N, N, 1) - mycount(i + 1, j, N, N, 1) + mycount(i + 1, j + 1, N, N, 1); for (int i = 1; i <= N / 2; i++) for (int j = N; j > N / 2; j--) if (!map[i][j]) map[i][j] = mycount(i, 1, N, j, 2) - mycount(i, 1, N, j - 1, 2) - mycount(i + 1, 1, N, j, 2) + mycount(i + 1, 1, N, j - 1, 2); for (int i = N; i > N / 2; i--) for (int j = 1; j <= N / 2; j++) if (!map[i][j]) map[i][j] = mycount(1, j, i, N, 3) - mycount(1, j + 1, i, N, 3) - mycount(1, j, i - 1, N, 3) + mycount(1, j + 1, i - 1, N, 3); for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) if (map[i][j]) Report(i, j); }
#Verdict Execution timeMemoryGrader output
Fetching results...