QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#197963#3514. Boulderingbeshoyhany#WA 3ms6152kbC++174.4kb2023-10-02 22:47:142023-10-02 22:47:14

Judging History

This is the latest submission verdict.

  • [2023-10-02 22:47:14]
  • Judged
  • Verdict: WA
  • Time: 3ms
  • Memory: 6152kb
  • [2023-10-02 22:47:14]
  • Submitted

answer

#pragma GCC optimize("O3")
#pragma GCC optimize ("unroll-loops")
#pragma GCC optimize ("Ofast,no-stack-protector", "omit-frame-pointer", "inline", "-ffast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.2,fma,popcnt,abm,mmx,avx")

#include<bits/stdc++.h>

#define ll long long
#define pp push_back
#define endl '\n'
#define all(x) x.begin(),x.end()
#define ld long double
#define PI acos(-1)
#define sin(a) sin((a)*PI/180)
#define cos(a) cos((a)*PI/180)
#define ones(x) __builtin_popcountll(x)
//#define int ll

using namespace std;

void Drakon() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
#ifdef Clion
    freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
#endif
}

unsigned long long inf = 1e10;
const double EPS = 1e-6;
const int MOD = 1000000007, N = 30, LOG = 25;

ll gcd(ll x, ll y) {
    return y ? gcd(y, x % y) : x;
}

ll lcm(ll a, ll b) {
    return (a * b) / __gcd(a, b);
}

ll mul(const ll &a, const ll &b) {
    return (a % MOD + MOD) * (b % MOD + MOD) % MOD;
}

ll add(const ll &a, const ll &b) {
    return (a + b + 2 * MOD) % MOD;
}

ll pw(ll x, ll y) {
    ll ret = 1;
    while (y > 0) {
        if (y % 2 == 0) {
            x = mul(x, x);
            y = y / 2;
        } else {
            ret = mul(ret, x);
            y = y - 1;
        }
    }
    return ret;
}

int h, w, r, s;
char arr[N][N];
pair<int, int>top, bot;
vector<pair<pair<int, int>, double>>adj[N][N];

void dijkstra(){
    double dist[h][w][(h + w) * 9];
    for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
            for (int k = 0; k < (h + w) * 9; ++k) {
                dist[i][j][k] = 1e9;
            }
        }
    }

    dist[bot.first][bot.second][min(s, (h + w) * 9 - 1)] = 0;
    priority_queue<pair<pair<double, int>, pair<int, int>>, vector<pair<pair<double, int>, pair<int, int>>>, greater<>>q;
    q.push({{0, min(s - (arr[bot.first][bot.second] - '0'), (h + w) * 9 - 1)}, bot});
    while (!q.empty()){
        auto p = q.top();
        q.pop();
        int x = p.second.first, y = p.second.second, sta = p.first.second;
        double d = p.first.first;
        if(d - dist[x][y][sta] > EPS)continue;
        for(auto v : adj[x][y]){
            if(sta >= arr[v.first.first][v.first.second] - '0'){
                if(dist[v.first.first][v.first.second][sta - (arr[v.first.first][v.first.second] - '0')] - (d + v.second) > EPS){
                    dist[v.first.first][v.first.second][sta - (arr[v.first.first][v.first.second] - '0')] = d + v.second;
                    q.push({{d + v.second, sta - (arr[v.first.first][v.first.second] - '0')}, v.first});
                }
            }
        }
    }

    double ans = 1e9;
    for (int i = 0; i <= min(s, (h + w) * 9 - 1); ++i) {
        ans = min(ans, dist[top.first][top.second][i]);
    }
    if(ans > 1e8){
        cout << "impossible";
        return;
    }
    cout << fixed << setprecision(10) << ans;
}

void solve() {
    cin >> h >> w >> r >> s;
    for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
            cin >> arr[i][j];
        }
    }

    bool found = false;
    for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
            if(arr[i][j] != '.'){
                top = {i, j};
                found = true;
                break;
            }
        }
        if(found)break;
    }

    found = false;
    for (int i = h - 1; i >= 0; --i) {
        for (int j = 0; j < w; ++j) {
            if(arr[i][j] != '.'){
                bot = {i, j};
                found = true;
                break;
            }
        }
        if(found)break;
    }

    for (int i = 0; i < h; ++i) {
        for (int j = 0; j < w; ++j) {
            if(arr[i][j] == '.')continue;
            for (int k = 0; k < h; ++k) {
                for (int l = 0; l < w; ++l) {
                    if(k == i && l == j)continue;
                    if(arr[k][l] == '.')continue;;
                    int d = (i - k) * (i - k) + (j - l) * (j - l);
                    if(d <= r * r){
                        adj[i][j].pp({{k, l}, sqrt(d)});
                    }
                }
            }
        }
    }

    dijkstra();
}

signed main() {
    Drakon();
    int t = 1;
    //cin >> t;
    while (t--) {
        solve();
    }
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3996kb

input:

12 11 3 11
...........
........3..
.......3.1.
...........
.......2...
.....2.....
.1.1.......
.....2.....
.1.........
...2.......
.1.........
...........

output:

13.5432037669

result:

ok 

Test #2:

score: 0
Accepted
time: 0ms
memory: 4220kb

input:

8 16 3 15
......1.........
....1..1.1......
..2........1....
...2......1.....
.....4.1..2..1..
................
.......1........
................

output:

6.4142135624

result:

ok 

Test #3:

score: 0
Accepted
time: 0ms
memory: 3740kb

input:

10 10 2 10
...2......
..........
...5.2....
..........
.....3....
....5.....
..2....2..
..1.......
....2.....
..1.......

output:

impossible

result:

ok 

Test #4:

score: 0
Accepted
time: 0ms
memory: 3860kb

input:

5 5 1 100
....1
.1111
.1.9.
.119.
..1..

output:

6.0000000000

result:

ok 

Test #5:

score: 0
Accepted
time: 0ms
memory: 4012kb

input:

6 7 3 10
..6....
..1....
.......
.5..1..
.......
..1....

output:

6.6568542495

result:

ok 

Test #6:

score: 0
Accepted
time: 0ms
memory: 3628kb

input:

2 18 2 5
.............1....
...............9..

output:

impossible

result:

ok 

Test #7:

score: -100
Wrong Answer
time: 3ms
memory: 6152kb

input:

25 25 1 1000000
9........................
21.21921.21921.21921.2193
92.92.92.92.92.92.92.92.3
.2..2..2..2..2..2..2..2.3
12.12.12.12.12.12.12.12.3
29.29.29.29.29.29.29.29.3
2..2..2..2..2..2..2..2..3
21.21.21.21.21.21.21.21.3
92.92.92.92.92.92.92.92.3
.2..2..2..2..2..2..2..2.3
12.12.12.12.12.12.12.12....

output:

impossible

result:

wrong answer