QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#286375#7743. Grand FinaleTsReaperWA 41ms28216kbC++172.4kb2023-12-17 19:27:212023-12-17 19:27:21

Judging History

你现在查看的是最新测评结果

  • [2023-12-17 19:27:21]
  • 评测
  • 测评结果:WA
  • 用时:41ms
  • 内存:28216kb
  • [2023-12-17 19:27:21]
  • 提交

answer

#include <bits/stdc++.h>
#define MAXN 2500
#define MAXM 2500
#define INF ((int) 1e9)
using namespace std;

int n, m;
char H[MAXN + 10], P[MAXM + 10];

int num[MAXM + 10][3], f[MAXM + 10][MAXM / 2 + 10];
bool g[MAXM + 10][MAXN + MAXM + 10];

int idx(char c) {
    if (c == 'Q') return 1;
    else if (c == 'B') return 2;
    else return 0;
}

int query(int i, int j) {
    if (j * 2 >= m - i) return 0;
    return f[i][j];
}

void solve() {
    scanf("%d%d%s%s", &n, &m, H + 1, P + 1);

    for (int i = 0; i < 3; i++) num[0][i] = 0;
    for (int i = 1; i <= n; i++) num[0][idx(H[i])]++;
    for (int i = 1; i <= m; i++) {
        for (int j = 0; j < 3; j++) num[i][j] = num[i - 1][j];
        num[i][idx(P[i])]++;
    }

    for (int i = m - 1; i >= 0; i--) for (int j = 0; j * 2 < m - i; j++) {
        f[i][j] = INF;

        if (P[i + 1] == 'Q') f[i][j] = min(f[i][j], max(query(i + 1, j), 1));
        else if (P[i + 1] == 'B') f[i][j] = min(f[i][j], query(i + 1, j + 1) + 1);
        else f[i][j] = min(f[i][j], query(i + 1, j) + 1);

        if (j == 0) continue;
        if (P[i + 2] == 'Q') f[i][j] = min(f[i][j], max(query(i + 1, j - 1) - 1, 0));
        else if (P[i + 2] == 'B') f[i][j] = min(f[i][j], query(i + 1, j));
        else f[i][j] = min(f[i][j], query(i + 1, j - 1));
    }

    for (int i = 0; i <= m; i++) for (int j = 0; j <= num[m][2]; j++) g[i][j] = false;
    g[0][num[0][2]] = true;
    for (int i = 0; i < m; i++) for (int j = 0; j <= num[i][2]; j++) if (g[i][j]) {
        int one = i - (num[i][2] - j) * 2;
        if (one < 0) continue;

        if (one > 0) {
            if (P[i + 1] == 'B') g[i + 1][j + 1] = true;
            else g[i + 1][j] = true;
        }

        if (j > 0 && i + 2 <= m) {
            int tmp = (P[i + 1] == 'B' ? 1 : 0) + (P[i + 2] == 'B' ? 1 : 0);
            g[i + 2][j - 1 + tmp] = true;
        }
    }

    for (int k = n; k <= n + m; k++) for (int t = 0; t <= m; t++) {
        int i = t + k - n;
        if (i < 0 || i > m) continue;
        int cnt1 = num[i][1] - t + k - n;
        int cnt2 = num[i][2] - k + n;
        if (cnt1 >= 0 && cnt2 >= 0 && query(i, cnt2) <= cnt1 && g[i][cnt2]) {
            printf("%d\n", k);
            return;
        }
    }
    printf("IMPOSSIBLE\n");
}

int main() {
    int tcase; scanf("%d", &tcase);
    while (tcase--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 5972kb

input:

2
2 6
BG
BQWBWW
4 6
GQBW
WWWWQB

output:

3
IMPOSSIBLE

result:

ok 2 lines

Test #2:

score: 0
Accepted
time: 1ms
memory: 6016kb

input:

2
3 8
QBG
BBBWBWWW
3 8
QBG
BBBWBWWW

output:

3
3

result:

ok 2 lines

Test #3:

score: -100
Wrong Answer
time: 41ms
memory: 28216kb

input:

13
184 887
WBQBBWWBQBQBQBWWBBQQWWQQQBBBQWWWQWBBBBWWWQQBQQQWQBBQQWQQBBWWQWQQBWBQWWWWQWQQWQBWWQQWWQQBWWQWBBBWWQWBQBQWQQWWBQBQQBWQBQBWWBWQWQWBWBQWWQBQQQBWQQWQWWBQBWWQQBQWBQQBQQBQBBQBWBQQWWQBWBBQQBQG
QWBQBQBWBQQWWWWQBBBQQQBBBWWWWQWQWWQQQBQBWQQQBWQWQBWWBQQQWQWBQBBQBWBBWBQWQBWWQQBWQQWWQWWQQWBQQWQWBBQBWBQQ...

output:

184
IMPOSSIBLE
IMPOSSIBLE
161
152
IMPOSSIBLE
IMPOSSIBLE
IMPOSSIBLE
233
IMPOSSIBLE
33
160
IMPOSSIBLE

result:

wrong answer 2nd lines differ - expected: '372', found: 'IMPOSSIBLE'