QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#103108 | #5476. Remodeling the Dungeon | 8BQube# | RE | 2ms | 4048kb | C++17 | 2.3kb | 2023-05-04 14:54:59 | 2023-05-04 14:55:02 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define X first
#define Y second
#define SZ(a) ((int)a.size())
#define pb push_back
#define ALL(v) v.begin(), v.end()
string mp[1005];
vector<int> G[25005];
int dx[2] = {1, 0}, dy[2] = {0, 1};
int pa[25005], tag[25005], bln[25005];
void dfs(int u, int f) {
pa[u] = f;
for (int i : G[u])
if (i != f)
dfs(i, u);
}
void dfs2(int u, int f, int p) {
bln[u] = p;
for (int i : G[u])
if (i != f && !tag[i])
dfs2(i, u, p);
}
void dfs3(int u, int f, int d, int *dis) {
dis[u] = d;
for (int i : G[u])
if (i != f)
dfs3(i, u, d + 1, dis);
}
int dis[2][25005];
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int n, m;
cin >> n >> m;
for (int i = 0; i < 2 * n + 1; ++i)
cin >> mp[i];
auto add_edge = [&](int x1, int y1, int x2, int y2) {
x1 /= 2, y1 /= 2, x2 /= 2, y2 /= 2;
int u = x1 * m + y1;
int v = x2 * m + y2;
G[u].pb(v);
G[v].pb(u);
};
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) {
int x = 2 * i + 1, y = 2 * j + 1;
for (int d = 0; d < 2; ++d)
if (mp[x + dx[d]][y + dy[d]] == '.')
add_edge(x, y, x + dx[d] * 2, y + dy[d] * 2);
}
int t = (n - 1) * m + m - 1;
dfs(0, -1);
vector<int> stk;
for (int x = t; x != -1; x = pa[x])
stk.pb(x), tag[x] = 1;
for (int i : stk)
dfs2(i, i, i);
dfs3(0, 0, 1, dis[0]), dfs3(t, t, 1, dis[1]);
int ans = dis[0][t];
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) {
int x = 2 * i + 1, y = 2 * j + 1;
for (int d = 0; d < 2; ++d)
if (x + dx[d] + dx[d] < 2 * n + 1 && y + dy[d] + dy[d] < 2 * m + 1 && mp[x + dx[d]][y + dy[d]] != '.') {
int u = i * m + j;
int v = ((x + dx[d] * 2) / 2) * m + ((y + dy[d] * 2) / 2);
if (bln[u] == bln[v]) continue;
if (dis[0][bln[u]] < dis[0][bln[v]]) ans = max(ans, dis[0][u] + dis[1][v]);
else ans = max(ans, dis[1][u] + dis[0][v]);
}
}
cout << ans << "\n";
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 4044kb
input:
2 3 +-+-+-+ |.....| +.+.+.+ |.|.|.| +-+-+-+
output:
6
result:
ok single line: '6'
Test #2:
score: 0
Accepted
time: 2ms
memory: 4032kb
input:
2 3 +-+-+-+ |...|.| +.+.+.+ |.|...| +-+-+-+
output:
4
result:
ok single line: '4'
Test #3:
score: 0
Accepted
time: 0ms
memory: 4048kb
input:
5 5 +-+-+-+-+-+ |...|...|.| +-+.+.+.+.+ |...|.|.|.| +.+.+.+-+.+ |.|...|.|.| +.+.+-+.+.+ |.|.....|.| +-+.+.+-+.+ |...|.....| +-+-+-+-+-+
output:
15
result:
ok single line: '15'
Test #4:
score: -100
Runtime Error
input:
500 500 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...