QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#103108#5476. Remodeling the Dungeon8BQube#RE 2ms4048kbC++172.3kb2023-05-04 14:54:592023-05-04 14:55:02

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-04 14:55:02]
  • 评测
  • 测评结果:RE
  • 用时:2ms
  • 内存:4048kb
  • [2023-05-04 14:54:59]
  • 提交

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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...

output:


result: