QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#113704 | #6644. Red Black Grid | hos_lyric | AC ✓ | 10ms | 9008kb | C++14 | 7.0kb | 2023-06-19 04:38:40 | 2023-06-19 04:38:41 |
Judging History
answer
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
using Int = long long;
template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
constexpr int LIM_SMALL = 9;
void experiment() {
/*
for (int N = 1; N <= 5; ++N) {
vector<int> brt(2*N*(N-1) + 1, 0);
for (int p = 0; p < 1 << (N*N); ++p) {
int cnt = 0;
for (int x = 0; x < N; ++x) for (int y = 0; y < N; ++y) {
if (x + 1 < N && (p >> (x*N+y) & 1) != (p >> ((x+1)*N+y) & 1)) ++cnt;
if (y + 1 < N && (p >> (x*N+y) & 1) != (p >> (x*N+(y+1)) & 1)) ++cnt;
}
brt[cnt] = 1;
}
if (N <= 10) {
cerr << N << ": ";
for (int x = 0; x <= 2*N*(N-1); ++x) cerr << brt[x];
cerr << endl;
}
}
//*/
for (int N = 1; N <= 100; ++N) {
vector<int> can(2*N*(N-1) + 1, 0);
for (int a = 1; a < N; ++a) for (int b = 1; b < N; ++b) {
const int lim = (max(a - 2, 0) * max(b - 2, 0) + 1) / 2;
for (int i = 0; i <= lim; ++i) {
can[a + b + 4 * i] = 1;
}
}
for (int x = 0; x <= 2*N*(N-1); ++x) if (can[x]) {
can[2*N*(N-1) - x] = 1;
}
if (N <= 12) {
cerr << N << ": ";
for (int x = 0; x <= 2*N*(N-1); ++x) cerr << can[x];
cerr << endl;
}
if (N > LIM_SMALL) {
for (int x = 2; x <= 2*N*(N-1) - 2; ++x) {
// assert(can[x]);
}
}
}
}
int small[LIM_SMALL + 1][2*LIM_SMALL*(LIM_SMALL-1) + 1][LIM_SMALL + 1][LIM_SMALL + 1];
void pre() {
for (int N = 1; N <= LIM_SMALL; ++N) {
bitset<2*LIM_SMALL*(LIM_SMALL-1) + 1>
dp[LIM_SMALL * LIM_SMALL + 1][1 << LIM_SMALL] = {};
for (int p = 0; p < 1 << N; ++p) {
dp[N * N][p][0] = true;
}
for (int z = N * N; --z >= 0; ) {
const int x = z / N, y = z % N;
for (int p = 0; p < 1 << N; ++p) {
for (int a = 0; a < 2; ++a) {
const int pp = (p & ~(1 << y)) | a << y;
int d = 0;
if (x > 0 && (p >> y & 1) != a) ++d;
if (y > 0 && (p >> (y-1) & 1) != a) ++d;
dp[z][p] |= dp[z + 1][pp] << d;
}
}
}
for (int K = 0; K <= 2*N*(N-1); ++K) {
if (dp[0][0][K]) {
int p = 0, k = K;
for (int z = 0; z < N * N; ++z) {
const int x = z / N, y = z % N;
for (int a = 0; a < 2; ++a) {
const int pp = (p & ~(1 << y)) | a << y;
int d = 0;
if (x > 0 && (p >> y & 1) != a) ++d;
if (y > 0 && (p >> (y-1) & 1) != a) ++d;
if (k >= d && dp[z + 1][pp][k - d]) {
small[N][K][x][y] = a;
p = pp;
k -= d;
goto found;
}
}
assert(false);
found:{}
}
} else {
for (int x = 0; x < N; ++x) for (int y = 0; y < N; ++y) {
small[N][K][x][y] = -1;
}
}
}
}
}
int f[1010][1010];
void judge(int N, int K) {
for (int x = 0; x < N; ++x) for (int y = 0; y < N; ++y) {
assert(f[x][y] == 0 || f[x][y] == 1);
}
int cnt = 0;
for (int x = 0; x < N; ++x) for (int y = 0; y < N; ++y) {
if (x + 1 < N && f[x][y] != f[x + 1][y]) ++cnt;
if (y + 1 < N && f[x][y] != f[x][y + 1]) ++cnt;
}
if (K != cnt) {
cerr << "judge failed N = " << N << ", K = " << K << ", cnt = " << cnt << endl;
for (int x = 0; x < N; ++x) {
for (int y = 0; y < N; ++y) cerr << f[x][y];
cerr << endl;
}
}
assert(K == cnt);
}
bool solveDiff(int N, int K) {
if (K == 0) {
for (int x = 0; x < N; ++x) for (int y = 0; y < N; ++y) f[x][y] = 0;
return true;
}
for (int a = 1; a < N; ++a) for (int b = 1; b < N; ++b) {
if (a + b <= K && (K - (a + b)) % 4 == 0) {
const int lim = (max(a - 2, 0) * max(b - 2, 0) + 1) / 2;
const int tar = (K - (a + b)) / 4;
if (tar <= lim) {
for (int x = 0; x < N; ++x) for (int y = 0; y < N; ++y) f[x][y] = 0;
for (int x = 0; x < a; ++x) for (int y = 0; y < b; ++y) f[x][y] = 1;
int cnt = 0;
for (int x = 1; x < a - 1; ++x) for (int y = 1; y < b - 1; ++y) if (!((x + y) & 1)) {
if (cnt++ < tar) {
f[x][y] = 0;
}
}
return true;
}
}
}
return false;
}
bool solve(int N, int K) {
if (N <= LIM_SMALL) {
if (~small[N][K][0][0]) {
for (int x = 0; x < N; ++x) for (int y = 0; y < N; ++y) f[x][y] = small[N][K][x][y];
return true;
} else {
return false;
}
} else if (solveDiff(N, K)) {
return true;
} else if (solveDiff(N, 2*N*(N-1) - K)) {
for (int x = 0; x < N; ++x) for (int y = 0; y < N; ++y) if ((x + y) & 1) f[x][y] ^= 1;
return true;
} else {
return false;
}
}
void stress() {
for (int N = 1; N <= 50; ++N) {
vector<int> can(2*N*(N-1) + 1, 0);
for (int K = 0; K <= 2*N*(N-1); ++K) {
const bool res = solve(N, K);
if (res) {
if (N <= 15) {
cerr << N << " " << K << endl;
for (int x = 0; x < N; ++x) {
for (int y = 0; y < N; ++y) cerr << f[x][y];
cerr << endl;
}
}
can[K] = 1;
judge(N, K);
}
}
if (N <= 10) {
cerr << N << ": ";
for (int x = 0; x <= 2*N*(N-1); ++x) cerr << can[x];
cerr << endl;
}
for (int x = 2; x <= 2*N*(N-1) - 2; ++x) {
assert(can[x]);
}
}
}
int main() {
pre();
// experiment();
// stress();
for (int numCases; ~scanf("%d", &numCases); ) { for (int caseId = 1; caseId <= numCases; ++caseId) {
int N, K;
scanf("%d%d", &N, &K);
const bool res = solve(N, K);
if (res) {
#ifdef LOCAL
judge(N,K);
#endif
puts("Possible");
for (int x = 0; x < N; ++x) {
for (int y = 0; y < N; ++y) {
putchar("BR"[f[x][y]]);
}
puts("");
}
} else {
puts("Impossible");
}
}
#ifndef LOCAL
break;
#endif
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 2ms
memory: 4812kb
input:
2 3 6 3 1
output:
Possible BBB BBR BRB Impossible
result:
ok correct! (2 test cases)
Test #2:
score: 0
Accepted
time: 10ms
memory: 4832kb
input:
4424 1 0 2 4 2 3 2 2 2 1 2 0 3 12 3 11 3 10 3 9 3 8 3 7 3 6 3 5 3 4 3 3 3 2 3 1 3 0 4 24 4 23 4 22 4 21 4 20 4 19 4 18 4 17 4 16 4 15 4 14 4 13 4 12 4 11 4 10 4 9 4 8 4 7 4 6 4 5 4 4 4 3 4 2 4 1 4 0 5 40 5 39 5 38 5 37 5 36 5 35 5 34 5 33 5 32 5 31 5 30 5 29 5 28 5 27 5 26 5 25 5 24 5 23 5 22 5 21 5...
output:
Possible B Possible BR RB Impossible Possible BB BR Impossible Possible BB BB Possible BRB RBR BRB Impossible Possible BBR BRB RBR Possible BBB RBR BRB Possible BBB BRB RBR Possible BBB BRR RBB Possible BBB BBR BRB Possible BBB BBR RBB Possible BBB BBB RBR Possible BBB BBB BRB Possible BBB BBB BBR I...
result:
ok correct! (4424 test cases)
Test #3:
score: 0
Accepted
time: 2ms
memory: 8972kb
input:
1 1000 0
output:
Possible BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB...
result:
ok correct! (1 test case)
Test #4:
score: 0
Accepted
time: 4ms
memory: 6868kb
input:
1 1000 1
output:
Impossible
result:
ok correct! (1 test case)
Test #5:
score: 0
Accepted
time: 1ms
memory: 8804kb
input:
1 1000 1998000
output:
Possible BRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRB...
result:
ok correct! (1 test case)
Test #6:
score: 0
Accepted
time: 4ms
memory: 6868kb
input:
1 1000 1997999
output:
Impossible
result:
ok correct! (1 test case)
Test #7:
score: 0
Accepted
time: 1ms
memory: 8772kb
input:
1 1000 1638091
output:
Possible RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...
result:
ok correct! (1 test case)
Test #8:
score: 0
Accepted
time: 2ms
memory: 8656kb
input:
1 1000 726743
output:
Possible RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...
result:
ok correct! (1 test case)
Test #9:
score: 0
Accepted
time: 9ms
memory: 8780kb
input:
1 1000 1159802
output:
Possible RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...
result:
ok correct! (1 test case)
Test #10:
score: 0
Accepted
time: 9ms
memory: 8776kb
input:
1 1000 1824691
output:
Possible RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...
result:
ok correct! (1 test case)
Test #11:
score: 0
Accepted
time: 3ms
memory: 8784kb
input:
1 1000 1606348
output:
Possible RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR...
result:
ok correct! (1 test case)
Test #12:
score: 0
Accepted
time: 4ms
memory: 5152kb
input:
100 100 3588 100 16278 100 14222 100 3818 100 16278 100 2672 100 7447 100 5705 100 9385 100 19205 100 16362 100 14175 100 327 100 18201 100 3519 100 14923 100 5358 100 17389 100 8773 100 7611 100 2185 100 3314 100 2358 100 18271 100 9499 100 12584 100 8079 100 16954 100 12620 100 16333 100 7148 100 ...
output:
Possible RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBBBB RBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBBBBB RRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRB...
result:
ok correct! (100 test cases)
Test #13:
score: 0
Accepted
time: 3ms
memory: 7504kb
input:
10 280 56983 468 47999 111 964 346 192134 60 3108 348 98521 421 57292 24 310 29 1080 484 17366
output:
Possible RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBB RBRBRBRBRB...
result:
ok correct! (10 test cases)
Test #14:
score: 0
Accepted
time: 0ms
memory: 9008kb
input:
13 44 3612 468 9437 171 34192 174 33316 121 15295 249 1231 84 9464 170 56598 358 183525 369 42656 29 595 226 74474 296 34671
output:
Possible RBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBBRBRBRBR BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRRBRBRBRB RBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBRBBRBRBRBR BRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRRBRBRBRB BRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBR RBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRB BRBRBRBRBRBRBRBRBRBRB...
result:
ok correct! (13 test cases)
Test #15:
score: 0
Accepted
time: 9ms
memory: 5024kb
input:
792 43 1432 33 1687 39 1872 49 906 41 27 49 1140 41 2730 39 1350 33 1625 26 986 26 1079 29 377 50 2930 24 536 28 874 44 1659 36 46 26 1199 46 1289 50 1662 48 59 20 90 37 2025 40 1971 31 443 31 511 36 1940 29 1515 21 104 24 432 23 337 38 2222 36 1016 24 786 23 737 50 1728 45 2032 22 183 50 416 44 375...
output:
Possible RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRBBBB RBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBBBB RRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRRBBBB RBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBBBB RRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRRBBBB RBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBRBBBB RRBRBRBRBRBRBRBRBRBRBRBRBRB...
result:
ok correct! (792 test cases)