void solve() { int N = cin.nextint; var D = new Two_D(N, N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { D[i, j] = cin.nextint; } } D.build(); var A = new long[N * N + 1]; for (int sx = 0; sx < N; sx++) { for (int sy = 0; sy < N; sy++) { for (int gx = sx; gx < N; gx++) { for (int gy = sy; gy < N; gy++) { int W = (gy - sy + 1) * (gx - sx + 1); A[W] = Math.Max(A[W], D.query(sy, sx, gy, gx)); } } } } for (int i = 1; i < A.Length; i++) { A[i] = Math.Max(A[i], A[i - 1]); } int Q = cin.nextint; for (int i = 0; i < Q; i++) { WriteLine(A[cin.nextint]); } }
void solve() { int H = cin.nextint; int W = cin.nextint; var T = new Two_D(H, W); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { T.D[i, j] = cin.nextint; if ((i + j) % 2 == 1) { T.D[i, j] *= -1; } } } T.build(); long ans = 0; for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { for (int k = i; k < H; k++) { for (int l = j; l < W; l++) { if (T.query(i, j, k, l) == 0) { ans = Math.Max(ans, (k - i + 1) * (l - j + 1)); } } } } } WriteLine(ans); }
void solve() { int N = cin.nextint; int K = cin.nextint; var P = new Two_D(2 * K, 2 * K); var Q = new Two_D(2 * K, 2 * K); for (int i = 0; i < N; i++) { int y = cin.nextint; int x = cin.nextint; var c = cin.next[0]; if (c == 'W') { Q.D[y % (2 * K), x % (2 * K)]++; y += K; P.D[y % (2 * K), x % (2 * K)]++; } else { P.D[y % (2 * K), x % (2 * K)]++; y += K; Q.D[y % (2 * K), x % (2 * K)]++; } } //for (int i = 0; i < 2 * K; i++) //{ // for (int j = 0; j < 2 * K; j++) // { // Write(P.D[i, j]); // } // WriteLine(); //} //WriteLine(); P.build(); Q.build(); long ans = 0; for (int i = 0; i < K; i++) { for (int j = 0; j < K; j++) { long ret = P.query(i, Min(i + K - 1, 2 * K - 1), j, Min(j + K - 1, 2 * K - 1)); if (i > 0 && j > 0) { ret += P.query(0, i - 1, 0, j - 1); //?? } if (i > 0) { ret += P.query(0, i - 1, j + K, 2 * K - 1); //?? } if (j > 0) { ret += P.query(i + K, 2 * K - 1, 0, j - 1); //?? } ret += P.query(i + K, 2 * K - 1, j + K, 2 * K - 1); //?? ans = Max(ret, ans); ret = Q.query(i, Min(i + K - 1, 2 * K - 1), j, Min(j + K - 1, 2 * K - 1)); if (i > 0 && j > 0) { ret += Q.query(0, i - 1, 0, j - 1); } if (i > 0) { ret += Q.query(0, i - 1, j + K, 2 * K - 1); } if (j > 0) { ret += Q.query(i + K, 2 * K - 1, 0, j - 1); } ret += Q.query(i + K, 2 * K - 1, j + K, 2 * K - 1); ans = Max(ret, ans); } } WriteLine(ans); }