QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#707931#9537. Chinese Chessucup-team173TL 144ms7436kbC++205.4kb2024-11-03 18:14:452024-11-03 18:14:45

Judging History

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

  • [2024-11-03 18:14:45]
  • 评测
  • 测评结果:TL
  • 用时:144ms
  • 内存:7436kb
  • [2024-11-03 18:14:45]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

void solve() {
    auto valid = [&](int x, int y) {
        return 0 <= x && x < 10 && 0 <= y && y < 9;
    };
    auto getTo = [&](int x, int y, int ty) {
        vector<pair<int, int>> tmp;
        if(ty == 0) {
            for(int i = -1; i <= 1; i += 2) {
                tmp.push_back({x + i, y});
                tmp.push_back({x, y + i});
            }
        } else if(ty == 1) {
            for(int i = -1; i <= 1; i += 2) {
                for(int j = -1; j <= 1; j += 2) {
                    tmp.push_back({x + i, y + j});
                }
            }
        } else if(ty == 2) {
            for(int r = 0; r < 10; r++) if(r != x) tmp.push_back({r, y});
            for(int c = 0; c < 9; c++) if(c != y) tmp.push_back({x, c});
        } else if(ty == 3) {
            for(int i = -2; i <= 2; i += 4) {
                for(int j = -1; j <= 1; j += 2) {
                    tmp.push_back({x + i, y + j});
                    tmp.push_back({x + j, y + i});
                }
            }
        } else if(ty == 4) {
            for(int i = -2; i <= 2; i += 4) {
                for(int j = -2; j <= 2; j += 4) {
                    tmp.push_back({x + i, y + j});
                }
            }
        } else {
            tmp.push_back({x + 1, y});
            if(x > 4) {
                tmp.push_back({x, y + 1});
                tmp.push_back({x, y - 1});
            }
        }
        vector<pair<int, int>> res;
        for(auto [x, y] : tmp) if(valid(x, y)) res.push_back({x, y});
        return res;
    };
    vector f(10, vector(9, vector(6, vector(10, vector(9, -1)))));
    for(int i = 0; i < 10; i++) {
        for(int j = 0; j < 9; j++) {
            for(int ty = 0; ty < 6; ty++) {
                auto &g = f[i][j][ty];
                queue<pair<int, int>> q;
                q.push({i, j});
                g[i][j] = 0;
                while(q.size()) {
                    auto [x, y] = q.front(); q.pop();
                    for(auto [tx, ty] : getTo(x, y, ty)) {
                        if(g[tx][ty] == -1) {
                            g[tx][ty] = g[x][y] + 1;
                            q.push({tx, ty});
                        }
                    }
                }
            }
        }
    }
    int n;
    cin >> n;
    constexpr int N = 540;
    using B = bitset<N>;
    auto id = [&](int x, int y, int ty) {
        return (x * 9 + y) * 6 + ty;
    };
    auto rid = [&](int id) {
        return make_tuple(id / 6 / 9, id / 6 % 9, id % 6);
    };
    B A;
    for(int i = 0; i < n; i++) {
        int x, y;
        cin >> x >> y;
        for(int j = 0; j < 6; j++) {
            A[id(x, y, j)] = 1;
        }
    }
    using T = unordered_map<int, B>;
    unordered_map<B, int> mp, g;
    unordered_map<B, T> G;
    unordered_map<B, pair<int, int>> best;
    auto print = [&](B A) {
        for(int id = A._Find_first(); id < N; id = A._Find_next(id)) {
            auto [x, y, t] = rid(id);
            cerr << "   " << x << ' ' << y << ' ' << t << endl;
        }
    };
    // A.flip();
    // print(A);
    auto get = [&](int i, int j, B &A) {
        T res;
        for(int id = A._Find_first(); id < N; id = A._Find_next(id)) {
            auto [x, y, t] = rid(id);
            res[f[x][y][t][i][j]][id] = 1;
        }
        return res;
    };
    auto getty = [&](B A) {
        vector<int> tys(6, 0);
        for(int i = A._Find_first(); i < N; i = A._Find_next(i)) {
            auto [x, y, ty] = rid(i);
            tys[ty] = 1;
        }
        if(accumulate(tys.begin(), tys.end(), 0) > 1) return -1;
        for(int i = 0; i < 6; i++) if(tys[i]) return i;
    };
    auto dfs1 = [&](auto self, B A, int dep, int mxdep) {
        if(getty(A) != -1) return 0;
        if(g.count(A)) return g[A];
        if(dep > mxdep) return 10;
        // cerr << dep << '\n';
        g[A] = 10;
        for(int i = 0; i < 10; i++) {
            for(int j = 0; j < 9; j++) {
                auto nG = get(i, j, A);
                if(nG.size() == 1) continue;
                int mx = 0;
                for(auto [k, v] : nG) {
                    mx = max(mx, self(self, v, dep + 1, mxdep) + 1);
                    if(mx > mxdep) break;
                }
                // if(dep == 0) {
                //     cerr << i << ' ' << j << ' ' << mx << endl;
                // }
                if(mx < g[A]) {
                    g[A] = mx;
                    best[A] = {i, j};
                    G[A] = nG;
                }
            }
        }
        return g[A];
    };
    dfs1(dfs1, A, 0, 3);
    cout << g[A] << endl;
    // cerr << g.size() << endl;
    // cerr << 1. * clock() / CLOCKS_PER_SEC << '\n';
    // return;
    auto dfs2 = [&](auto self, B A) {
        // print(A);
        // cerr << g[A] << '\n';
        if(getty(A) != -1) {
            cout << "! " << "JSCMXB"[getty(A)] << endl;
            return;
        }
        auto [x, y] = best[A];
        cout << "? " << x << ' ' << y << endl;
        int res;
        cin >> res;
        // print(G[A][res]);
        self(self, G[A][res]);
    };
    dfs2(dfs2, A);
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int t = 1;
    // cin >> t;
    while(t--) solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 8ms
memory: 4020kb

input:

1
9 0
8

output:

1
? 1 8
! S

result:

ok number is guessed.

Test #2:

score: 0
Accepted
time: 18ms
memory: 4376kb

input:

4
2 1
2 3
2 5
2 7
5
1

output:

2
? 0 0
? 0 6
! M

result:

ok number is guessed.

Test #3:

score: 0
Accepted
time: 9ms
memory: 4064kb

input:

1
2 4
-1
1

output:

2
? 0 0
? 0 2
! X

result:

ok number is guessed.

Test #4:

score: 0
Accepted
time: 8ms
memory: 4024kb

input:

1
5 0
6

output:

1
? 3 6
! S

result:

ok number is guessed.

Test #5:

score: 0
Accepted
time: 8ms
memory: 4056kb

input:

1
6 0
6

output:

1
? 0 2
! S

result:

ok number is guessed.

Test #6:

score: 0
Accepted
time: 9ms
memory: 4120kb

input:

2
7 7
1 0
-1
6

output:

2
? 0 0
? 7 2
! S

result:

ok number is guessed.

Test #7:

score: 0
Accepted
time: 33ms
memory: 4788kb

input:

5
8 6
1 3
0 5
2 4
0 2
6
3

output:

2
? 0 0
? 0 3
! J

result:

ok number is guessed.

Test #8:

score: 0
Accepted
time: 43ms
memory: 5332kb

input:

6
0 7
1 6
2 8
0 5
7 6
8 2
-1
14

output:

2
? 0 0
? 8 1
! B

result:

ok number is guessed.

Test #9:

score: 0
Accepted
time: 90ms
memory: 6532kb

input:

7
6 5
3 0
3 2
4 1
4 0
2 4
5 2
5
7

output:

2
? 0 0
? 0 4
! J

result:

ok number is guessed.

Test #10:

score: 0
Accepted
time: 96ms
memory: 6672kb

input:

8
3 3
2 5
6 2
7 4
1 4
3 0
2 4
3 4
7
-1

output:

2
? 0 1
? 0 0
! S

result:

ok number is guessed.

Test #11:

score: 0
Accepted
time: 98ms
memory: 6324kb

input:

9
2 7
2 4
2 5
2 2
2 1
2 0
2 6
2 3
2 8
6
8

output:

2
? 2 0
? 0 0
! J

result:

ok number is guessed.

Test #12:

score: 0
Accepted
time: 75ms
memory: 6172kb

input:

10
4 0
0 0
5 0
7 0
8 0
1 0
6 0
9 0
2 0
3 0
9
-1

output:

2
? 9 0
? 0 1
! B

result:

ok number is guessed.

Test #13:

score: 0
Accepted
time: 78ms
memory: 6000kb

input:

9
1 8
1 2
1 5
1 6
1 3
1 4
1 0
1 1
1 7
6
7

output:

2
? 1 0
? 0 0
! J

result:

ok number is guessed.

Test #14:

score: 0
Accepted
time: 66ms
memory: 5556kb

input:

10
0 4
5 4
8 4
2 4
4 4
7 4
3 4
9 4
6 4
1 4
11
5

output:

2
? 9 1
? 0 0
! J

result:

ok number is guessed.

Test #15:

score: 0
Accepted
time: 72ms
memory: 5908kb

input:

9
4 6
4 5
4 7
4 4
4 1
4 3
4 0
4 8
4 2
6
12

output:

2
? 4 2
? 0 0
! J

result:

ok number is guessed.

Test #16:

score: 0
Accepted
time: 73ms
memory: 5696kb

input:

10
9 2
5 2
1 2
8 2
6 2
7 2
2 2
0 2
4 2
3 2
10
3

output:

2
? 9 0
? 0 0
! J

result:

ok number is guessed.

Test #17:

score: 0
Accepted
time: 73ms
memory: 5696kb

input:

9
3 1
3 7
3 5
3 3
3 6
3 4
3 0
3 2
3 8
6
11

output:

2
? 3 2
? 0 0
! J

result:

ok number is guessed.

Test #18:

score: 0
Accepted
time: 74ms
memory: 5952kb

input:

10
5 1
8 1
6 1
4 1
3 1
0 1
2 1
7 1
9 1
1 1
10
-1

output:

2
? 9 0
? 0 0
! B

result:

ok number is guessed.

Test #19:

score: 0
Accepted
time: 76ms
memory: 6080kb

input:

9
1 6
1 4
1 3
1 7
1 8
1 5
1 2
1 1
1 0
6
7

output:

2
? 1 0
? 0 0
! J

result:

ok number is guessed.

Test #20:

score: 0
Accepted
time: 74ms
memory: 5912kb

input:

10
5 0
9 0
1 0
2 0
3 0
6 0
7 0
4 0
0 0
8 0
9
-1

output:

2
? 9 0
? 0 1
! B

result:

ok number is guessed.

Test #21:

score: 0
Accepted
time: 144ms
memory: 7436kb

input:

9
0 3
0 5
0 7
0 0
0 4
0 8
0 1
0 6
0 2
6
5

output:

2
? 0 0
? 0 1
! J

result:

ok number is guessed.

Test #22:

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

input:

10
1 0
9 0
4 0
2 0
8 0
7 0
5 0
3 0
0 0
6 0
9
-1

output:

2
? 9 0
? 0 1
! B

result:

ok number is guessed.

Test #23:

score: 0
Accepted
time: 79ms
memory: 5848kb

input:

9
1 8
1 2
1 7
1 0
1 4
1 6
1 1
1 5
1 3
6
7

output:

2
? 1 0
? 0 0
! J

result:

ok number is guessed.

Test #24:

score: 0
Accepted
time: 66ms
memory: 5496kb

input:

10
2 4
1 4
0 4
6 4
4 4
9 4
5 4
3 4
7 4
8 4
11
5

output:

2
? 9 1
? 0 0
! J

result:

ok number is guessed.

Test #25:

score: 0
Accepted
time: 144ms
memory: 7236kb

input:

9
0 2
0 7
0 5
0 4
0 0
0 3
0 1
0 6
0 8
6
5

output:

2
? 0 0
? 0 1
! J

result:

ok number is guessed.

Test #26:

score: 0
Accepted
time: 70ms
memory: 5660kb

input:

10
5 3
2 3
3 3
8 3
9 3
1 3
6 3
7 3
0 3
4 3
11
4

output:

2
? 9 0
? 0 0
! J

result:

ok number is guessed.

Test #27:

score: -100
Time Limit Exceeded

input:

50
7 5
9 2
0 4
9 3
8 4
8 2
7 2
6 4
4 4
0 0
1 7
1 1
1 5
2 0
9 8
9 0
3 1
7 8
8 6
5 0
7 3
8 5
2 6
4 8
3 5
6 8
0 8
5 7
4 6
1 6
3 8
5 6
3 0
5 3
0 7
5 1
3 4
0 1
7 6
2 3
4 3
5 5
8 1
0 3
6 5
9 5
5 8
7 4
6 3
2 7
-1
3
2

output:

3
? 0 0
? 1 0
? 0 1
! S

result: