Submission #394781

#TimeUsernameProblemLanguageResultExecution timeMemory
394781Nima_NaderiPortals (BOI14_portals)C++14
100 / 100
768 ms219004 KiB
//In the name of GOD
#include<bits/stdc++.h>
using namespace std;

//typedef long long ll;
typedef int ll;
const ll MXN = 1e6 + 5;
const ll MXK = 1e3 + 5;
const ll INF = 1e9;
ll n, m;
ll gin[MXN], Q[MXN], dis[MXN], nxt[4][MXN];
string s[MXK];
vector<ll> adj[MXN], lvl[MXN];
vector<pair<ll, ll>> G[MXN];
vector<pair<ll, ll>> dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
bool wall[4][MXN], vis[MXN];
inline ll Id(ll i, ll j){
	return i * m + j + 1;
}
inline bool check(ll x, ll y){
	return (0 <= x && x < n && 0 <= y && y < m);
}
void BFS0(){
	ll L = 0, R = -1;
	for(int i = 1; i <= n * m; i ++){
		if(!gin[i]) vis[i] = 1, Q[++ R] = i;
	}
	while(L < R){
		ll u = Q[L ++];
		for(auto v : adj[u]){
			if(!vis[v]){
				gin[v] = gin[u] + 1;
				Q[++ R] = v; vis[v] = 1;
			}
		}
	}
}
ll DIJ(ll src, ll snk){
	memset(vis, 0, sizeof vis);
	memset(dis, 31, sizeof dis);
	dis[src] = 0; lvl[0].push_back(src);
	for(int d = 0; d < MXN; d ++){
		for(auto u : lvl[d]){
			if(vis[u]) continue;
			if(u == snk) return d;
			vis[u] = 1;
			for(auto Pr : G[u]){
				ll v, w; tie(v, w) = Pr;
				if(!vis[v] && w + d < dis[v]){
					dis[v] = w + d;
					lvl[dis[v]].push_back(v);
				}
			}	
		}
	}
	return -1;
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);
	cin >> n >> m; ll src, snk;
	for(int i = 0; i < n; i ++) cin >> s[i];
	for(int i = 0; i < n; i ++){
		for(int j = 0; j < m; j ++){
			ll u = Id(i, j); gin[u] = INF;
			if(s[i][j] == '#') continue;
			if(s[i][j] == 'S') src = Id(i, j);
			if(s[i][j] == 'C') snk = Id(i, j);
			for(int d = 0; d < 4; d ++){
				ll ip = i + dir[d].first, jp = j + dir[d].second;
				if(!check(ip, jp) || s[ip][jp] == '#') wall[d][u] = 1, gin[u] = 0;
				else adj[u].push_back(Id(ip, jp));	
			}
		}
	}
	for(int i = 0; i < n; i ++){
		for(int j = 0; j < m; j ++){
			if(s[i][j] == '#') continue;
			ll u = Id(i, j);
			nxt[2][u] = (wall[2][u] ? u : nxt[2][Id(i, j - 1)]);
		}
		for(int j = m - 1; ~j; j --){
			if(s[i][j] == '#') continue;
			ll u = Id(i, j);
			nxt[0][u] = (wall[0][u] ? u : nxt[0][Id(i, j + 1)]);
		}
	}
	for(int j = 0; j < m; j ++){
		for(int i = 0; i < n; i ++){
			if(s[i][j] == '#') continue;
			ll u = Id(i, j);
			nxt[3][u] = (wall[3][u] ? u : nxt[3][Id(i - 1, j)]);
		}
		for(int i = n - 1; ~i; i --){
			if(s[i][j] == '#') continue;
			ll u = Id(i, j);
			nxt[1][u] = (wall[1][u] ? u : nxt[1][Id(i + 1, j)]);
		}
	}
	BFS0();
	for(int i = 0; i < n; i ++){
		for(int j = 0; j < m; j ++){
			ll u = Id(i, j), v;
			for(int d = 0; d < 4; d  ++){
				v = nxt[d][u];
				if(v != u && v != Id(i + dir[d].first, j + dir[d].second)) G[u].push_back({v, gin[u] + 1});
			}
			for(auto v : adj[u]){
				G[u].push_back({v, 1});
			}
		}
	}
	cout << DIJ(src, snk) << '\n';
	return 0;
}
// N.N_2004
// THIS IS THE PAYOFF

Compilation message (stderr)

portals.cpp: In function 'int main()':
portals.cpp:112:27: warning: 'src' may be used uninitialized in this function [-Wmaybe-uninitialized]
  112 |  cout << DIJ(src, snk) << '\n';
      |                           ^~~~
portals.cpp:112:27: warning: 'snk' may be used uninitialized in this function [-Wmaybe-uninitialized]
#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...