結果
| 問題 | No.20 砂漠のオアシス | 
| コンテスト | |
| ユーザー |  dnish | 
| 提出日時 | 2018-06-23 16:18:57 | 
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 23 ms / 5,000 ms | 
| コード長 | 3,061 bytes | 
| コンパイル時間 | 1,833 ms | 
| コンパイル使用メモリ | 175,976 KB | 
| 実行使用メモリ | 6,944 KB | 
| 最終ジャッジ日時 | 2024-06-30 18:28:05 | 
| 合計ジャッジ時間 | 2,662 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 21 | 
ソースコード
#include "bits/stdc++.h"
#define REP(i,n,N) for(ll i=(n); i<(N); i++)
#define RREP(i,n,N) for(ll i=(N-1); i>=n; i--)
#define CK(n,a,b) ((a)<=(n)&&(n)<(b))
#define ALL(v) (v).begin(),(v).end()
#define p(s) cout<<(s)<<endl
#define p2(a,b) cout<<(a)<<" "<<(b)<<endl
#define v2(T) vector<vector<T>>
typedef long long ll;
using namespace std;
const ll inf=1e18;
ll dy[] = {0,1,0,-1};
ll dx[] = {1,0,-1,0};
ll N, V, OY, OX;
ll L[210][210];
ll d1[210][210];//(y,x)に行くのにかかるコストの最小
void dijkstra1(){
    priority_queue< pair<ll, pair<ll,ll> > > PQ;    //(y,x)に行くのにかかるコスト*(-1)
    REP(i,0,N){
        REP(j,0,N){
            d1[i][j] = inf;
        }
    }
    d1[0][0] = 0;
    PQ.push({0, {0,0}});
    while(!PQ.empty()){
        ll curCost = -PQ.top().first;
        ll y = PQ.top().second.first;
        ll x = PQ.top().second.second;
        PQ.pop();
        if(d1[y][x] < curCost){
            continue;
        }
        d1[y][x] = curCost;
        REP(k,0,4){
            ll ny = y + dy[k];
            ll nx = x + dx[k];
            if(!CK(ny,0,N) || !CK(nx,0,N)) continue;
            ll addCost = L[ny][nx];
            if(d1[ny][nx] > curCost + addCost){
                d1[ny][nx] = curCost + addCost;
                PQ.push({-d1[ny][nx], {ny, nx}});
            }
        }
    }
}
ll d2[210][210];    //オアシスからのコスト
void dijkstra2(){
    priority_queue< pair<ll, pair<ll,ll> > > PQ;    //(y,x)に行くのにかかるコスト*(-1)
    REP(i,0,N){
        REP(j,0,N){
            d2[i][j] = inf;
        }
    }
    d2[OY-1][OX-1] = 0;
    PQ.push({0, {OY-1,OX-1}});
    while(!PQ.empty()){
        ll curCost = -PQ.top().first;
        ll y = PQ.top().second.first;
        ll x = PQ.top().second.second;
        PQ.pop();
        if(d2[y][x] < curCost){
            continue;
        }
        d2[y][x] = curCost;
        REP(k,0,4){
            ll ny = y + dy[k];
            ll nx = x + dx[k];
            if(!CK(ny,0,N) || !CK(nx,0,N)) continue;
            ll addCost = L[ny][nx];
            if(d2[ny][nx] > curCost + addCost){
                d2[ny][nx] = curCost + addCost;
                PQ.push({-d2[ny][nx], {ny, nx}});
            }
        }
    }
}
int main(){
    while(cin>>N>>V>>OX>>OY){
        REP(i,0,N){
            REP(j,0,N){
                cin>>L[i][j];
            }
        }
        dijkstra1();
        //cout<<"d>> "<<d1[OY-1][OX-1]<<endl;
        //オアシスに行かずにゴールできる.
        if(d1[N-1][N-1] < V){
            cout<<"YES"<<endl;
            continue;
        }
        if((OY == 0 && OX == 0)){
            cout<<"NO"<<endl;
            continue;
        }else if(d1[OY-1][OX-1] >= V){
            cout<<"NO"<<endl;
            continue;
        }else{
            //cout<<"d2"<<endl;
            dijkstra2();
            if(d2[N-1][N-1] < (V-d1[OY-1][OX-1])*2){
                cout<<"YES"<<endl;
            }else{
                cout<<"NO"<<endl;
            }
        }
    }
    return 0;
}
            
            
            
        