제출 #1109858

#제출 시각아이디문제언어결과실행 시간메모리
1109858raspyTracks in the Snow (BOI13_tracks)C++17
100 / 100
629 ms240636 KiB
#include <bits/stdc++.h>

#define int long long
#define vi vector<int>
#define ii pair<int, int>
#define f first
#define s second
#define all(x) (x).begin(), (x).end()
#define P 31
#define mod 1'000'000'007
#define inf 1'000'000'000'000
#define pb push_back
#define str string
#define sz(x) (x).size()
#define vvi vector<vi>
#define fun function
#define oopt cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false);
#define file freopen("problemname.in", "r", stdin); freopen("pr.out", "w", stdout);
#define dbg(v) cout << "Line(" << __LINE__ << ") -> " << #v << " = " << (v) << endl;

using namespace std;
template <class T, int SZ> using arr = array<T, SZ>;

char a[4001][4001];
int ds[4001][4001];
vector<ii> pr = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

signed main()
{
	oopt;
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			cin >> a[i][j];
			ds[i][j] = inf;
		}
	ds[0][0] = 1;
	int rez = 1;
	deque<ii> dq;
	dq.pb({0, 0});
	while (dq.size())
	{
		ii t = dq.front();
		dq.pop_front();
		rez = max(rez, ds[t.f][t.s]);
		for (ii d : pr)
		{
			int i = t.f+d.f, j = t.s+d.s;
			if (i < 0 || j < 0 || i >= n || j >= m || a[i][j] == '.') continue;
			if (ds[i][j] > ds[t.f][t.s]+(a[i][j] != a[t.f][t.s]))
			{
				ds[i][j] = ds[t.f][t.s]+(a[i][j] != a[t.f][t.s]);
				if (a[i][j] == a[t.f][t.s])
					dq.push_front({i, j});
				else
					dq.pb({i, j});
			}
		}
	}
	cout << rez << "\n";
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...