Submission #371229

#TimeUsernameProblemLanguageResultExecution timeMemory
371229maozkurtPohlepko (COCI16_pohlepko)C++17
0 / 80
1100 ms45036 KiB
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <numeric>
#include <cassert>

#define endl '\n'
#define sp ' '

#define pb push_back
#define mp make_pair
#define ff first
#define ss second

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

const int maxn = 2005;

char arr[maxn][maxn];
int d[maxn][maxn];
int p[maxn][maxn];
const int inf = 1e9;
int n,m;
void dijkstra(){
    using paa = pair<int,pii>;
    priority_queue<paa,vector<paa>,greater<paa>> q;
    
    fill(&d[0][0],&d[n-1][m-1] + 1,inf);
    d[0][0] = 0;
    q.push({0,{0,0}});

    while(q.size()){
        int curd = q.top().ff;
        int curi = q.top().ss.ff;
        int curj = q.top().ss.ss;
        q.pop();
        if(curd != d[curi][curj])
            continue;

        if(curi<n-1){
            if(d[curi+1][curj] > d[curi][curj] + arr[curi][curj]){
                d[curi+1][curj] = d[curi][curj] + arr[curi][curj];
                q.push({d[curi+1][curj],{curi+1,curj}});
                p[curi+1][curj] = 1;
            }
        }

        if(curj<m-1){
            if(d[curi][curj+1] > d[curi][curj] + arr[curi][curj]){
                d[curi][curj+1] = d[curi][curj] + arr[curi][curj];
                q.push({d[curi][curj+1],{curi,curj+1}});
                p[curi][curj+1] = -1;
            }
        }
    }
}

int main(){
    
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cerr.tie(nullptr);
    
    cin>>n>>m;
    for(int i=0;i<n;i++)
        cin >> arr[i];
    
    dijkstra();
    

    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout << p[i][j] << sp;
        }
        cout << endl;
    }    
    int i=n-1,j=m-1;
    string ans;
    ans += arr[i][j];
    while(i!=0 || j!=0){
        if(p[i][j] == 1){
            ans.pb((char)(d[i][j] - d[i-1][j]));
            i--;
        }
        else if(p[i][j] == -1){
            ans.pb((char)(d[i][j] - d[i][j-1]));
            j--;
        }
        else
            abort();
    }
    for(int c=(int)ans.size()-1;c>=0;c--){
        cout << ans[c];
    }
    cout << endl;
    
}











#Verdict Execution timeMemoryGrader output
Fetching results...