結果

提出番号 1006
提出者 kotamanegi
言語 C++
提出日時 2017-08-05 23:36:26
問題名 (44)玉ねぎの収穫をするkotamanegi
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 55ms 22768KB
2 AC 100% 41ms 17072KB
3 AC 100% 80ms 30400KB
4 AC 100% 79ms 39904KB
5 AC 100% 73ms 23040KB
6 AC 100% 239ms 62528KB
7 AC 100% 9ms 8320KB
8 AC 100% 95ms 29824KB
9 AC 100% 82ms 36368KB
10 AC 100% 113ms 31728KB
11 AC 100% 63ms 28000KB
12 AC 100% 17ms 24496KB
13 AC 100% 113ms 29904KB
14 AC 100% 35ms 22320KB
15 AC 100% 299ms 60016KB
16 AC 100% 14ms 10080KB
17 AC 100% 69ms 28848KB
18 AC 100% 78ms 32128KB
19 AC 100% 77ms 26864KB
20 AC 100% 7ms 13984KB

ソースコード

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <algorithm>
#include <utility>
#include <functional>
#include <cstring>
#include <queue>
#include <stack>
#include <math.h>
#include <iterator>
#include <vector>
#include <string>
#include <set>
#include <math.h>
#include <iostream> 
#include <random>
#include<map>
#include <iomanip>
#include <time.h>
#include <stdlib.h>
#include <list>
#include <typeinfo>
#include <list>
#include <set>
#include <cassert>
#include<fstream>
#include <unordered_map>  
using namespace std;
#define eps 0.00000001
#define LONG_INF 10000000000000000
#define GOLD 1.61803398874989484820458
#define MAX_MOD 1000000007
#define f(n) for(int i=0;i<n;++i)
#define REP(i,n) for(long long i = 0;i < n;++i)
long long dp[2000][2000] = {};
bool done[2000][2000] = {};
long long y[2000] = {}, x[2000] = {};
int main() {
#define int long long
	int h, w;
	cin >> h >> w;
	REP(i, h) {
		REP(q, w) {
			dp[i + 1][q + 1] = LONG_INF;
		}
	}
	dp[1][1] = 0;
	int y_dis, x_dis;
	cin >> x_dis >> y_dis;
	REP(i, h) {
		cin >> x[i + 1];
	}
	REP(i, w) {
		cin >> y[i + 1];
	}
	long long a, b, c, d;
	cin >> a >> b >> c >> d;
	for (int i = a;i <= b;++i) {
		for (int q = c;q <= d;++q) {
			done[i][q] = 1;
		}
	}
	priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> hoge;
	hoge.push(make_tuple(0, 1, 1));
	while (hoge.empty() == false) {
		tuple<int, int, int> wow = hoge.top();hoge.pop();
		if (done[get<1>(wow)][get<2>(wow)] == false) {
			done[get<1>(wow)][get<2>(wow)] = true;
			if (get<1>(wow) < h) {
				if (done[get<1>(wow) + 1][get<2>(wow)] == false && dp[get<1>(wow) + 1][get<2>(wow)] > get<0>(wow) + y[get<2>(wow)]) {
					dp[get<1>(wow) + 1][get<2>(wow)] = get<0>(wow) + y[get<2>(wow)];
					hoge.push(make_tuple(dp[get<1>(wow) + 1][get<2>(wow)], get<1>(wow) + 1, get<2>(wow)));
				}
			}
			if (get<1>(wow) > 1) {
				if (done[get<1>(wow) - 1][get<2>(wow)] == false && dp[get<1>(wow) - 1][get<2>(wow)] > get<0>(wow) + y[get<2>(wow)]) {
					dp[get<1>(wow) - 1][get<2>(wow)] = get<0>(wow) + y[get<2>(wow)];
					hoge.push(make_tuple(dp[get<1>(wow) - 1][get<2>(wow)], get<1>(wow) - 1, get<2>(wow)));
				}
			}
			if (get<2>(wow) < w) {
				if (done[get<1>(wow)][get<2>(wow) + 1] == false && dp[get<1>(wow)][get<2>(wow) + 1] > get<0>(wow) + x[get<1>(wow)]) {
					dp[get<1>(wow)][get<2>(wow) + 1] = get<0>(wow) + x[get<1>(wow)];
					hoge.push(make_tuple(dp[get<1>(wow)][get<2>(wow) + 1], get<1>(wow), get<2>(wow) + 1));
				}
			}
			if (get<2>(wow) > 1) {
				if (done[get<1>(wow)][get<2>(wow) - 1] == false && dp[get<1>(wow)][get<2>(wow) - 1] > get<0>(wow) + x[get<1>(wow)]) {
					dp[get<1>(wow)][get<2>(wow) - 1] = get<0>(wow) + x[get<1>(wow)];
					hoge.push(make_tuple(dp[get<1>(wow)][get<2>(wow) - 1], get<1>(wow), get<2>(wow) - 1));
				}
			}
		}
	}
	if (dp[x_dis][y_dis] != LONG_INF) {
		cout << dp[x_dis][y_dis] << endl;
	}
	else {
		cout << -1 << endl;
	}
}