結果

提出番号 905
提出者 MMNMM
言語 C++
提出日時 2017-08-01 15:40:22
問題名 (44)玉ねぎの収穫をするkotamanegi
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 79ms 62176KB
2 AC 100% 6ms 45888KB
3 AC 100% 187ms 69360KB
4 AC 100% 155ms 77200KB
5 AC 100% 111ms 63440KB
6 AC 100% 457ms 101136KB
7 AC 100% 16ms 48224KB
8 AC 100% 166ms 70880KB
9 AC 100% 172ms 72896KB
10 AC 100% 157ms 74256KB
11 AC 100% 121ms 65584KB
12 AC 100% 43ms 59792KB
13 AC 100% 202ms 70272KB
14 AC 100% 63ms 61392KB
15 AC 100% 479ms 91296KB
16 AC 100% 20ms 50272KB
17 AC 100% 140ms 67008KB
18 AC 100% 153ms 70608KB
19 AC 100% 182ms 69392KB
20 AC 100% 14ms 52416KB

ソースコード

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

long long H, W, dp[1145][1145], d[1145][1145], x[1145], y[1145], X, Y, L, l, R, r;

bool outside(long long z, long long Z){
    return z <= 0 || z > H || Z <= 0 || (L <= z && z <= R && l <= Z && Z <= r) || Z > W;
}

void dijk(){
    long long T, Zx, Zy;
    priority_queue<tuple<long long, long long, long long>, vector<tuple<long long, long long, long long>>, greater<tuple<long long, long long, long long>>> pq;
    pq.push(make_tuple(0, 1, 1));
    dp[1][1] = 0;
    //for(int i = 50; i; --i){
    while(!pq.empty()){
        tie(T, Zx, Zy) = pq.top();
        //cout << Zx << " " << Zy << " " << T << endl;
        pq.pop();
        if(outside(Zx, Zy) || dp[Zx][Zy] < T)continue;
        dp[Zx][Zy] = min(dp[Zx][Zy], T);
        d[Zx][Zy] = true;
        if(!outside(Zx, Zy + 1) && !d[Zx][Zy + 1])pq.push(make_tuple(T + x[Zx - 1], Zx, Zy + 1));
        if(!outside(Zx, Zy - 1) && !d[Zx][Zy - 1])pq.push(make_tuple(T + x[Zx - 1], Zx, Zy - 1));
        if(!outside(Zx + 1, Zy) && !d[Zx + 1][Zy])pq.push(make_tuple(T + y[Zy - 1], Zx + 1, Zy));
        if(!outside(Zx - 1, Zy) && !d[Zx - 1][Zy])pq.push(make_tuple(T + y[Zy - 1], Zx - 1, Zy));
    }
}

int main(){
    fill(dp[0], dp[1145], 1145141919810LL);
    scanf("%lld%lld%lld%lld", &H, &W, &X, &Y);
    for(int i = 0; i < H; ++i)scanf("%lld", x + i);
    for(int i = 0; i < W; ++i)scanf("%lld", y + i);
    scanf("%lld%lld%lld%lld", &L, &R, &l, &r);
    if(L <= X && X <= R && l <= Y && Y <= r)return 0 & puts("-1");
    dijk();
    //for(int i = 0; i <= H + 1; ++i)
    //    for(int j = 0; j <= W + 1; ++j)
    //        cout << dp[i][j] << (j == W + 1 ? "\n": " ");
    cout << dp[X][Y] << endl;
}