Submission #1329508

#TimeUsernameProblemLanguageResultExecution timeMemory
1329508Jawad_Akbar_JJKraljica (COCI25_kraljica)C++20
110 / 110
2083 ms256652 KiB
#include <iostream>
#include <queue>
#include <set>

using namespace std;
const int N = 1005;
set<pair<int, int>> row[N], col[N], dg1[N<<1], dg2[N<<1];
vector<pair<int, int>> vec[10], vc;
int Mn[N][N];
char a[N][N];
pair<int, int> nxt[9][N][N];
int n, m, r1, c1, r2, c2;

void erase(int i, int j, int t = 0){
	row[i].erase({i, j});
	col[j].erase({i, j});
	dg1[i+j].erase({i, j});
	dg2[i-j+m].erase({i, j});
}

string print(pair<int, int> p){
	string ans = "{";
	ans += to_string(p.first);
	ans += ",";
	ans += to_string(p.second);
	ans += "}";
	return ans;
}

void bfs(int x, int y){
	erase(x, y);
	Mn[x][y] = 0;

	queue<pair<int, int>> Q;
	Q.push({x, y});
	while (Q.size() > 0){
		auto [r, c] = Q.front();
		Q.pop();

		vc = {};
		auto u = row[r].upper_bound(nxt[2][r][c]);
		
		while (u != row[r].end() and *u < nxt[4][r][c])
			vc.push_back(*u), u = next(u);

		u = col[c].upper_bound(nxt[1][r][c]);
		while (u != col[c].end() and *u < nxt[3][r][c])
			vc.push_back(*u), u = next(u);

		u = dg1[r+c].upper_bound(nxt[8][r][c]);
		while (u != dg1[r+c].end() and *u < nxt[6][r][c])
			vc.push_back(*u), u = next(u);
		
		u = dg2[m+r-c].upper_bound(nxt[5][r][c]);
		while (u != dg2[m+r-c].end() and *u < nxt[7][r][c])
			vc.push_back(*u), u = next(u);

		while (vc.size() > 0){
			auto [i, j] = vc.back();
			vc.pop_back();
			if (isdigit(a[i][j]))
				vc.insert(vc.end(), vec[a[i][j] - '0'].begin(), vec[a[i][j] - '0'].end()), vec[a[i][j] - '0'].clear();
			if (Mn[i][j] == 1e9)
				Mn[i][j] = Mn[r][c] + 1, erase(i, j), Q.push({i, j});
		}
	}
}

int main(){
	cin>>n>>m;

	for (int i=0;i<=n+1;i++){
		for (int j=0;j<=m+1;j++)
			a[i][j] = '#', Mn[i][j] = 1e9;
	}

	for (int i=1;i<=n;i++){
		for (int j=1;j<=m;j++){
			cin>>a[i][j];
			if (a[i][j] != '#'){
				row[i].insert({i, j});
				col[j].insert({i, j});
				dg1[i+j].insert({i, j});
				dg2[i-j+m].insert({i, j});
			}
			if (isdigit(a[i][j]))
				vec[a[i][j] - '0'].push_back({i, j});
			if (a[i][j] == 'S')
				r1 = i, c1 = j;
			if (a[i][j] == 'E')
				r2 = i, c2 = j;
		}
	}

	for (int i=0;i<=n+1;i++){
		for (int j=0;j<=m+1;j++){
			if (a[i][j] == '#')
				nxt[1][i][j] = nxt[2][i][j] = nxt[5][i][j] = nxt[8][i][j] = {i, j};
			else{
				nxt[1][i][j] = nxt[1][i-1][j];
				nxt[2][i][j] = nxt[2][i][j-1];
				nxt[5][i][j] = nxt[5][i-1][j-1];
				nxt[8][i][j] = nxt[8][i-1][j+1];
			}
		}
	}

	for (int i=n+1;i>=0;i--){
		for (int j=m+1;j>=0;j--){
			if (a[i][j] == '#')
				nxt[3][i][j] = nxt[4][i][j] = nxt[6][i][j] = nxt[7][i][j] = {i, j};
			else{
				nxt[3][i][j] = nxt[3][i+1][j];
				nxt[4][i][j] = nxt[4][i][j+1];
				nxt[6][i][j] = nxt[6][i+1][j-1];
				nxt[7][i][j] = nxt[7][i+1][j+1];
			}
		}
	}

	bfs(r1, c1);

	if (Mn[r2][c2] == 1e9)
		cout<<-1<<'\n';
	else
		cout<<Mn[r2][c2]<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...