Submission #97207

#TimeUsernameProblemLanguageResultExecution timeMemory
97207E869120Land of the Rainbow Gold (APIO17_rainbow)C++14
74 / 100
3059 ms17528 KiB
#include "rainbow.h" #include <iostream> #include <vector> #include <algorithm> using namespace std; const long long BASE = 10000000LL; vector<bool> used[2009]; int H, W, minx = (1 << 30), miny = (1 << 30), maxx = 0, maxy = 0; vector<int> A[4][2009], A2[2009], A3[2009], A4[2009]; vector<pair<int, int>> G[4]; void putvector(int px, int py) { G[0].push_back(make_pair(px, py)); G[1].push_back(make_pair(px, py - 1)); G[1].push_back(make_pair(px, py)); G[2].push_back(make_pair(px - 1, py)); G[2].push_back(make_pair(px, py)); G[3].push_back(make_pair(px - 1, py - 1)); G[3].push_back(make_pair(px - 1, py)); G[3].push_back(make_pair(px, py - 1)); G[3].push_back(make_pair(px, py)); } void init(int R, int C, int sr, int sc, int M, char *S) { H = R; W = C; if (1LL * H*W <= BASE) { for (int i = 0; i <= H; i++) used[i].resize(W + 1, true); for (int i = 0; i <= H; i++) { for (int j = 0; j < 4; j++) A[j][i].resize(W + 1, 0); } int cx = sr, cy = sc; used[cx][cy] = false; minx = cx; miny = cy; maxx = cx; maxy = cy; for (int i = 0; i < M; i++) { if (S[i] == 'E') cy++; if (S[i] == 'W') cy--; if (S[i] == 'N') cx--; if (S[i] == 'S') cx++; used[cx][cy] = false; minx = min(minx, cx); maxx = max(maxx, cx); miny = min(miny, cy); maxy = max(maxy, cy); } for (int i = 1; i <= H; i++) { for (int j = 1; j <= W; j++) { if (used[i][j] == true) A[0][i][j] = 1; } } for (int i = 1; i <= H; i++) { for (int j = 1; j <= W - 1; j++) { if (used[i][j] == true && used[i][j + 1] == true) A[1][i][j] = 1; } } for (int i = 1; i <= H - 1; i++) { for (int j = 1; j <= W; j++) { if (used[i][j] == true && used[i + 1][j] == true) A[2][i][j] = 1; } } for (int i = 1; i <= H - 1; i++) { for (int j = 1; j <= W - 1; j++) { if (used[i][j] == true && used[i][j + 1] == true && used[i + 1][j] == true && used[i + 1][j + 1] == true) A[3][i][j] = 1; } } for (int i = 0; i < 4; i++) { for (int j = 0; j <= H; j++) { for (int k = 1; k <= W; k++) A[i][j][k] += A[i][j][k - 1]; } for (int j = 1; j <= H; j++) { for (int k = 0; k <= W; k++) A[i][j][k] += A[i][j - 1][k]; } } } else { int cx = sr, cy = sc; putvector(cx, cy); for (int i = 0; i < M; i++) { if (S[i] == 'E') cy++; if (S[i] == 'W') cy--; if (S[i] == 'N') cx--; if (S[i] == 'S') cx++; putvector(cx, cy); minx = min(minx, cx); maxx = max(maxx, cx); miny = min(miny, cy); maxy = max(maxy, cy); } for (int i = 0; i < 4; i++) { sort(G[i].begin(), G[i].end()); G[i].erase(unique(G[i].begin(), G[i].end()), G[i].end()); } } } int ranged(int ty, int px, int py, int qx, int qy) { if (px > qx || py > qy) return 0; return A[ty][px - 1][py - 1] + A[ty][qx][qy] - A[ty][px - 1][qy] - A[ty][qx][py - 1]; } long long big_ranged_attack(int ty, int px, int py, int qx, int qy) { if (px > qx || py > py) return 0; int rem = 0; for (int i = 0; i < G[ty].size(); i++) { if (px <= G[ty][i].first && G[ty][i].first <= qx && py <= G[ty][i].second && G[ty][i].second <= qy) rem++; } return rem; } int colour(int ar, int ac, int br, int bc) { if (1LL * H*W <= BASE) { int Z1 = ranged(0, ar, ac, br, bc); int Z2 = ranged(1, ar, ac, br, bc - 1); int Z3 = ranged(2, ar, ac, br - 1, bc); int Z4 = ranged(3, ar, ac, br - 1, bc - 1); int BONUS = 0; if (ar < minx && maxx < br && ac < miny && maxy < bc) BONUS = 1; return (Z1 - Z2 - Z3 + Z4 + BONUS); } else { long long V1 = br - ar + 1, V2 = bc - ac + 1; long long Z1 = V1 * V2 - big_ranged_attack(0, ar, ac, br, bc); long long Z2 = V1 * (V2 - 1) - big_ranged_attack(1, ar, ac, br, bc - 1); long long Z3 = (V1 - 1) * V2 - big_ranged_attack(2, ar, ac, br - 1, bc); long long Z4 = (V1 - 1) * (V2 - 1) - big_ranged_attack(3, ar, ac, br - 1, bc - 1); long long BONUS = 0; if (ar < minx && maxx < br && ac < miny && maxy < bc) BONUS = 1; return (Z1 - Z2 - Z3 + Z4 + BONUS); } }

Compilation message (stderr)

rainbow.cpp: In function 'long long int big_ranged_attack(int, int, int, int, int)':
rainbow.cpp:85:20: warning: self-comparison always evaluates to false [-Wtautological-compare]
  if (px > qx || py > py) return 0;
                 ~~~^~~~
rainbow.cpp:88:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < G[ty].size(); i++) {
                  ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...