結果
| 問題 |
No.20 砂漠のオアシス
|
| コンテスト | |
| ユーザー |
こる
|
| 提出日時 | 2017-02-17 11:37:00 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,917 bytes |
| コンパイル時間 | 870 ms |
| コンパイル使用メモリ | 73,564 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-13 05:49:16 |
| 合計ジャッジ時間 | 1,681 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 16 WA * 5 |
ソースコード
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<functional>
#define ll long long
#define PLL pair<ll,ll>
#define VS vector<string>
#define VL vector<ll>
#define rep(i,a) for (ll i=0;i<a;i++)
#define nrep(i,n,a) for (ll i=n;i<a;i++)
#define INF 1145141919810
#define VMIN(vec) *std::max_element(vec.begin(),vec.end())
#define VMIN(vec) *std::max_element(vec.begin(),vec.end())
#define TS(n) to_string(n)
using namespace std;
struct NODE {
ll level, dist ,x ,y;
};
bool operator< (const NODE &node1, const NODE &node2) { return node1.dist < node2.dist; }
bool operator> (const NODE &node1, const NODE &node2) { return node1.dist > node2.dist; }
NODE nodes[210][210];
bool flag[210][210];
void update(priority_queue<NODE ,vector<NODE> ,greater<NODE> > &pq,NODE node,ll x, ll y) {
//cout << "update:" << x << " " << y << flag[x][y]<<endl;
if (nodes[x][y].dist == -1 || nodes[x][y].dist > node.dist + nodes[x][y].level) {
nodes[x][y].dist = nodes[x][y].level + node.dist;
if (!flag[x][y]) {
//cout << "yala" << endl;
flag[x][y] = true;
pq.push(nodes[x][y]);
//cout << "update_pq_size=" << pq.size() << endl;
}
}
}
int main() {
ll N, V, Ox, Oy;
cin >> N >> V >> Ox >> Oy;
rep(i, N) rep(j, N) {
cin >> nodes[i][j].level;
nodes[i][j].dist = -1;
nodes[i][j].x = i; nodes[i][j].y = j; flag[i][j] = false;
}
ll cost;
priority_queue<NODE, vector<NODE>, greater<NODE> > pq;
nodes[0][0].dist = 0;
pq.push(nodes[0][0]);
NODE node;
while (!pq.empty()) {
node = pq.top(); pq.pop();
//cout << node.x << " " << node.y << endl;
flag[node.x][node.y] = false;
if (node.x > 0) { update(pq, node, node.x - 1, node.y); }
if (node.x < N - 1) { update(pq, node, node.x + 1, node.y); }
if (node.y > 0) { update(pq, node, node.x, node.y - 1); }
if (node.y < N - 1) { update(pq, node, node.x, node.y + 1); }
//cout << "main_pq_size=" << pq.size() << endl;
}ll start_to_end = V - nodes[N - 1][N - 1].dist;
if (start_to_end > 0){
cout << "YES" << endl;
return 0;
}
if (start_to_end <= 0 && Ox == 0 && Oy == 0){
cout << "NO" << endl;
return 0;
}
ll start_to_O = (V - nodes[Ox - 1][Oy - 1].dist)*2;
if (start_to_O <= 0){
cout << "NO" << endl;
return 0;
}
rep(i, N) rep(j, N) nodes[i][j].dist = -1;
nodes[Ox - 1][Oy - 1].dist = 0;
pq.push(nodes[Ox - 1][Oy - 1]);
while (!pq.empty()) {
node = pq.top(); pq.pop();
//cout << node.x << " " << node.y << endl;
flag[node.x][node.y] = false;
if (node.x > 0) { update(pq, node, node.x - 1, node.y); }
if (node.x < N - 1) { update(pq, node, node.x + 1, node.y); }
if (node.y > 0) { update(pq, node, node.x, node.y - 1); }
if (node.y < N - 1) { update(pq, node, node.x, node.y + 1); }
//cout << "main_pq_size=" << pq.size() << endl;
}ll O_to_end = start_to_O - nodes[N - 1][N - 1].dist;
cout << (O_to_end > 0 ? "YES" : "NO") << endl;
return 0;
}
こる