제출 #708130

#제출 시각아이디문제언어결과실행 시간메모리
708130tgp072Tracks in the Snow (BOI13_tracks)C++14
100 / 100
1142 ms210916 KiB
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <string>
#include <tuple>
#include <numeric>
#include <climits>
#include <bitset>
#include <iomanip>
#include <random>
#include <ctime>
using namespace std;

typedef int ll;

ll max(ll a, ll b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

ll min(ll a, ll b) {
    if (a < b) {
        return a;
    } else {
        return b;
    }
}

const ll MAXN = 4001;
const ll MAXM = 2097153;
const ll MOD = 1e9 + 7;
const ll INF = 1e7;

ll dr[4] = {0, 1, 0, -1};
ll dc[4] = {1, 0, -1, 0};

void solve(ll ca) {
    ll h, w;
    cin >> h >> w;
    
    char grid[h][w];
    for (ll i = 0; i < h; i++) {
        for (ll j = 0; j < w; j++) {
            cin >> grid[i][j];
        }
    }
    
    ll cheapest[h][w];
    for (ll i = 0; i < h; i++) {
        for (ll j = 0; j < w; j++) {
            cheapest[i][j] = INF;
        }
    }
    
    deque<pair<ll, ll>> dq1;
    deque<ll> dq2;
    
    dq1.push_back({0, 0});
    dq2.push_back(0);
    
    ll ans = 0;
    while (!dq1.empty()) {
        pair<ll, ll> cur = dq1.front();
        ll cos = dq2.front();
        dq1.pop_front();
        dq2.pop_front();
        
        if (cheapest[cur.first][cur.second] != INF) {
            continue;
        }
        
        ans = max(ans, cos);
        cheapest[cur.first][cur.second] = cos;
        for (ll k = 0; k < 4; k++) {
            ll nr = cur.first + dr[k];
            ll nc = cur.second + dc[k];
            
            if (nr >= 0 && nr < h && nc >= 0 && nc < w && cheapest[nr][nc] == INF && grid[nr][nc] != '.') {
                if (grid[nr][nc] == grid[cur.first][cur.second]) {
                    dq1.push_front({nr, nc});
                    dq2.push_front(cos);
                } else {
                    dq1.push_back({nr, nc});
                    dq2.push_back(cos+1);
                }
            }
        }
    }
    
    cout << ans+1 << endl;
}

int main() {
    mt19937 rng(0);
    // Fast IO
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
  /*
    freopen("piggyback.in", "r", stdin);
    freopen("piggyback.out", "w", stdout);
*/
    ll t = 1;
    //cin >> t;
    
    ll co = 0;
    while (t--) {
        solve(co);
        co++;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...