結果

提出番号 911
提出者 kosakkun
言語 C++
提出日時 2017-08-01 15:42:59
問題名 (44)玉ねぎの収穫をするkotamanegi
結果 MLE
点数 0%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 79ms 152912KB
2 AC 100% 70ms 149632KB
3 AC 100% 143ms 174704KB
4 AC 100% 145ms 174464KB
5 AC 100% 139ms 164736KB
6 MLE 0% 432ms 266624KB
7 AC 100% 25ms 126800KB
8 AC 100% 219ms 180016KB
9 AC 100% 192ms 176224KB
10 AC 100% 147ms 177376KB
11 AC 100% 124ms 169152KB
12 AC 100% 38ms 135248KB
13 AC 100% 191ms 191680KB
14 AC 100% 66ms 147472KB
15 MLE 0% 582ms 279776KB
16 AC 100% 30ms 131520KB
17 AC 100% 142ms 175472KB
18 AC 100% 169ms 176928KB
19 AC 100% 143ms 175440KB
20 AC 100% 38ms 129968KB

ソースコード

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <sstream>
#include <cmath>
#include <set>
#include <iomanip>
#include <deque>
#include <stdio.h>
#include <random>
using namespace std;
 
#define REP(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
#define RREP(i,n) for(int (i)=(int)(n)-1;i>=0;i--)
#define REMOVE(Itr,n) (Itr).erase(remove((Itr).begin(),(Itr).end(),n),(Itr).end())
typedef long long ll;

template <class T> struct Dijkstra {

    struct Edge{
        int to;
        T cost;
        Edge(int _to, T _cost) : to(_to), cost(_cost) {}
    };
    
    const T INF_T = numeric_limits<T>::max() / 2;
    vector< vector< Edge > > G;
    vector< T > d;
    Dijkstra (int n) : G(n), d(n) {}

    void add_directed_edge(int a, int b, T c) {
        G[a].push_back(Edge(b,c));
    }
    
    void add_undirected_edge(int a, int b, T c) {
        G[a].push_back(Edge(b,c));
        G[b].push_back(Edge(a,c));
    }

    void init(int s) {
        priority_queue< pair<T,int>,vector< pair<T,int> >, greater< pair<T,int> > > que;
        for (int i = 0; i < d.size(); i++) d[i] = INF_T;
        d[s] = 0;
        que.push(make_pair(0,s));
        while (!que.empty()){
            pair<T,int> p = que.top();
            que.pop();
            int v = p.second;
            if (d[v] < p.first) continue;
            for (int i = 0; i < G[v].size(); i++) {
                Edge e = G[v][i];
                if (d[e.to] > d[v] + e.cost) {
                    d[e.to] = d[v] + e.cost;
                    que.push(make_pair(d[e.to],e.to));
                }
            }
        }
    }
    
    T dist(int a) {
        return d[a];
    }
    
}; 

int H,W,y,x;
vector<int> yc,xc;
int yl,yr,xl,xr;

int idx(int i, int j) {
    return i + j * 1010;
}

int main() {

    cin >> H >> W >> y  >> x;
    yc.resize(H+1);
    xc.resize(W+1);
    REP(i,H) cin >> yc[i+1];
    REP(i,W) cin >> xc[i+1];
    cin >> yl >> yr >> xl >> xr;

    Dijkstra<int> inst(1100010);

    for (int i = 1; i <= H; i++) {
        for (int j = 1; j <= W; j++) {
            if (yl <= i && i <= yr && xl <= j && j <= xr) continue;
            if (i != H && !(yl <= i + 1 && i + 1 <= yr && xl <= j && j <= xr)) 
                inst.add_directed_edge(idx(i,j),idx(i+1,j),xc[j]);
            if (i != 1 && !(yl <= i - 1 && i - 1 <= yr && xl <= j && j <= xr)) 
                inst.add_directed_edge(idx(i,j),idx(i-1,j),xc[j]);
            if (j != W && !(xl <= j + 1 && j + 1 <= xr && yl <= i && i <= yr)) 
                inst.add_directed_edge(idx(i,j),idx(i,j+1),yc[i]);
            if (j != 1 && !(xl <= j - 1 && j - 1 <= xr && yl <= i && i <= yr)) 
                inst.add_directed_edge(idx(i,j),idx(i,j-1),yc[i]);
        }
    }

    inst.init(idx(1,1));

    int ans = inst.dist(idx(y,x));
    if(ans == inst.INF_T) cout << -1 << endl;
    else cout << ans << endl;

    return 0;
}