Submission #656534

#TimeUsernameProblemLanguageResultExecution timeMemory
656534prashant_th18Mecho (IOI09_mecho)C++17
76 / 100
419 ms5376 KiB
#ifdef LOCAL
	#define _GLIBCXX_DEBUG
#endif
#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
#define sz(s) ((int)s.size())
#define all(v) begin(v), end(v)

typedef long double ld;
const int MOD = 1000000007;
#define ff first
#define ss second
const int inf = (int)1e9;

mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
using pll = pair<ll, ll>;

// *-> KISS*
int solve() {
    int n, s; cin >> n >> s;
	vector<string> v(n);
	for(int i = 0; i < n; ++i) cin >> v[i];
	pll start;
	vector<pll> bees;
	for(int i = 0; i < n; ++i) {
		for(int j = 0; j < n; ++j) {
			if(v[i][j] == 'M') start = {i, j};
			else if(v[i][j] == 'H') bees.push_back({i, j});
		}
	}
	// Valid function for mecho
	auto mvalid = [&](int i, int j) {
		return i >= 0 && j >= 0 && i < n && j < n && v[i][j] != 'T';
	};
	// valid function for bees
	auto bvalid = [&](int i, int j) {
		return i >= 0 && j >= 0 && i < n && j < n && v[i][j] != 'T' && v[i][j] != 'D';
	};

	int dx[] = {-1, 0, 1, 0};
	int dy[] = {0, 1, 0, -1};

	int ans = -1;
	int si = 0, ei = 10000;
	while(si <= ei) {
		int mid = (si + ei) >> 1;
		// We are assuming that Mecho will stay at it's place for mid minutes and then start moving towards 
		// his home
		vector<vector<bool>> bvis(n, vector<bool>(n, false)), 
			mvis(n, vector<bool>(n, false));
	
		vector<pll> last;
		vector<vector<int>> steps(n, vector<int>(n, inf));
		{
			queue<array<ll, 3>> q;
			for(int i = 0; i < sz(bees); ++i) {
				q.push({bees[i].ff, bees[i].ss, 0});
				bvis[bees[i].ff][bees[i].ss] = true;
			}
			while(!q.empty()) {
				array<ll, 3> t = q.front(); q.pop();
				/* debug(t); */
				steps[t[0]][t[1]] = 0;
				if(t[2] == mid) {
					last.push_back({t[0], t[1]});
					continue;
				}

				int x = t[0], y = t[1], step = t[2];

				for(int i = 0; i < 4; ++i) {
					int ni = x + dx[i], nj = y + dy[i];
					if(bvalid(ni, nj) && !bvis[ni][nj] && step + 1 <= mid) {
						bvis[ni][nj] = true;
						q.push({ni, nj, step + 1});
					}
				}
			}
		}

		bool yes = false;
		if(!bvis[start.ff][start.ss]) yes = true;
		
		queue<array<ll, 3>> q;
		for(int i = 0; i < sz(last); ++i) {
			q.push({last[i].ff, last[i].ss, 0});
		}
		while(!q.empty()) {
			array<ll, 3> _ = q.front(); q.pop();
			/* debug(_); */
			int x = _[0], y = _[1], step = _[2];
			steps[x][y] = step * s;
			for(int i = 0; i < 4; ++i) {
				int ni = x + dx[i], nj = y + dy[i];
				if(bvalid(ni, nj) && !bvis[ni][nj]) {
					q.push({ni, nj, step + 1});
					bvis[ni][nj] = true;
				}
			}
		}
		/* debug(steps); */
		q = queue<array<ll, 3>> ();

		/* debug(bvis); */
		
		if(yes) q.push({start.ff, start.ss, 0});

		/* if(!sz(q)) cout << mid << endl; */

		mvis[start.ff][start.ss] = true;
		ll minutes = -1; // -1 means unreachability
		while(!q.empty()) {
			array<ll, 3> t = q.front(); q.pop();
			int x = t[0], y = t[1], step = t[2];
			if(v[x][y] == 'D') {
				minutes = step;
				break;
			}

			for(int i = 0; i < 4; ++i) {
				int ni = x + dx[i], nj = y + dy[i];
				if(mvalid(ni, nj) && !mvis[ni][nj] && steps[ni][nj] > (step + 1)) {
					mvis[ni][nj] = true;
					q.push({ni, nj, step + 1});
				}
			}
		}
		if(minutes != -1) {
			ans = mid; si = mid + 1;
		}
		else ei = mid - 1;
	}
	cout << ans;
	return 0;
}
int32_t main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    bool test = false;
	int TET = 1;
    if(test) cin >> TET;
    cout << fixed << setprecision(6);
    for (int i = 1; i <= TET; i++) {
		#ifdef LOCAL
        	cout << "##################" << '\n';
		#endif

        if (solve()) {
            break;
        }
        cout << '\n';
    }
	#ifdef LOCAL
    	cout << endl << "finished in " << clock() * 1.0 / CLOCKS_PER_SEC << " sec" << endl;
	#endif
	return 0;
}
// -> Keep It Simple Stupid!
#Verdict Execution timeMemoryGrader output
Fetching results...