QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#707931 | #9537. Chinese Chess | ucup-team173 | TL | 144ms | 7436kb | C++20 | 5.4kb | 2024-11-03 18:14:45 | 2024-11-03 18:14:45 |
Judging History
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