Submission #1052828

#TimeUsernameProblemLanguageResultExecution timeMemory
1052828lozergamMaze (JOI23_ho_t3)C++17
100 / 100
1046 ms460592 KiB
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
 
using namespace std;
 
#define ll long long
#define pb push_back
#define For(i, n) for(int (i) = 0; (i) < (n); (i)++)
#define debug(x) cout << #x << " : " << x << endl << flush
#define endl '\n'
#define sz(x) (ll)x.size()
#define arr(x) array<ll, x>
#define insert emplace
 
//arr(2) s, e;
//ll n, m, k;
//ll ans;
//arr(2) v[6000000], g[6000000];
//ll pv = -1, pg = -1;
//
//int main()
//{
//	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
// 	
// 	srand(time(0));
////  	mt19937 mt(3);  
// 
//	cin >> n >> m >> k;
//	
//	bool a[n + 1][m + 1], vis[n + 1][m + 1];
//	
//	For(i, n + 1)
//		For(j, m + 1)
//			vis[i][j] = 0;
//	
//	cin >> s[0] >> s[1];
//	cin >> e[0] >> e[1];
//	
//	for(int i = 1;i <= n; i++)
//		for(int j = 1;j <= m; j++)
//		{
//			char c;
//			cin >> c;
//			
//			if(c == '.')
//				a[i][j] = 0;
//			else 
//				a[i][j] = 1;
//		}
//	
//	v[++pv] = s;
//	vis[s[0]][s[1]] = 1;
// 
//	while(1)
//	{
//		while(pv != -1)
//		{
//			auto x = v[pv];
//			if(x[0] == e[0] and x[1] == e[1])
//				break;
//			pv--;
//			
//			if(x[0] != 1 and !vis[x[0] - 1][x[1]])
//			{
//				if(a[x[0] - 1][x[1]])
//					g[++pg] = {x[0] - 1, x[1]};
//				else
//	            {
//	                vis[x[0] - 1][x[1]] = 1;
//					v[++pv] = {x[0] - 1, x[1]};
//	            }
//			}
//			
//			if(x[0] != n and !vis[x[0] + 1][x[1]])
//			{
//				if(a[x[0] + 1][x[1]])
//					g[++pg] = {x[0] + 1, x[1]};
//				else
//	            {
//					v[++pv] = {x[0] + 1, x[1]};
//	                vis[x[0] + 1][x[1]] = 1;
//	            }
//			}
//			
//			if(x[1] != 1 and !vis[x[0]][x[1] - 1])
//			{
//				if(a[x[0]][x[1] - 1])
//					g[++pg] = {x[0], x[1] - 1};
//				else
//	            {
//					v[++pv] = {x[0], x[1] - 1};
//	                vis[x[0]][x[1] - 1] = 1;
//	            }
//			}
//			
//			if(x[1] != m and !vis[x[0]][x[1] + 1])
//			{
//				if(a[x[0]][x[1] + 1])
//					g[++pg] = {x[0], x[1] + 1};
//				else
//	            {
//					v[++pv] = {x[0], x[1] + 1};
//	                vis[x[0]][x[1] + 1] = 1;
//	            }
//			}
//		}
//		
//		if(vis[e[0]][e[1]])
//			break;
//		
//		while(pg >= 0)
//		{
//			arr(2) x = g[pg];
//			arr(2) r, c;
//			
//			r[0] = max(x[0] - k + 1, 1);
//			r[1] = min(x[0] + k - 1, n);
//			c[0] = max(x[1] - k + 1, 1);
//			c[1] = min(x[1] + k - 1, m);
// 
//			if(e[0] >= r[0] and e[0] <= r[1] and e[1] >= c[0] and e[1] <= c[1])
//			{
//				cout << ans + 1 << endl;
//				return 0;
//			}
//			
//			For(i, 2)
//				For(j, 2)
//					if(!vis[r[i]][c[j]])
//					{
//						v[++pv] = {r[i], c[j]};
//						vis[r[i]][c[j]] = 1;
//					}
//			
//								
//			ll m = 50;
//						
//			if(k != 1)
//			{
//				For(i, m)
//				{
//					long long rn = rand();
//					
//					For(j, 2)
//					{
//						ll t = rn % (c[1] - c[0]) + c[0];
//						if(!vis[r[j]][t])
//						{
//							v[++pv] = {r[j], t};
//							vis[r[j]][t] = 1;
//						}
//					}
//					
//					For(j, 2)
//					{
//						ll t = rn % (r[1] - r[0]) + r[0];
//						if(!vis[t][c[j]])
//						{
//							v[++pv] = {t, c[j]};
//							vis[t][c[j]] = 1;
//						}
//					}
//				}
//			}
//			pg--;
//		}
//		
//		pg = -1;
//		
//		ans++;
//	}
//	
//	cout << ans << endl;
//}
//94/100	\(´~`)/
 
ll r, c, n;
arr(2) s, e;
queue<arr(2)> q[2];
ll ans, o = -1;
vector<vector<char>> a;//its not int!
ll pos;
queue<arr(3)> bfs1, bfs2;
vector<arr(3)> v;
vector<vector<bool>> vis1, vis2, vis3, vis4;

bool check(ll x, ll y, ll z)
{
   	if(x < 0 || y < 0 || x >= c || y >= r) return 1;
   	
    if(a[x][y] == '.')
	{
        q[z%2].push({x, y});
        return 1;
    }
    
    return 0;
};
    
int main(){
    
    cin >> c >> r >> n;
 
    cin >> s[0] >> s[1];
    s[0]--; s[1]--;
    
    cin >> e[0] >> e[1];
    e[0]--; e[1]--;
 
 	a.resize(c);
 	
 	For(i, c)
 	{
 		a[i].resize(r);	
	 	For(j, r)
		 	cin >> a[i][j];	
	}
 	
 
    q[0].push(s);
 
 	
 	vis1.resize(c);
 	vis2.resize(c);
 	vis3.resize(c);
 	vis4.resize(c);
 	
 	For(i, c)
 	{
 		vis1[i].resize(r);
 		vis2[i].resize(r);
 		vis3[i].resize(r);
 		vis4[i].resize(r);
 		
 		For(j, r)
 		{
 			vis1[i][j] = 0;
 			vis2[i][j] = 0;
 			vis3[i][j] = 0;
 			vis4[i][j] = 0;
		 }
	 }
 	
    while(pos < r*c && o == -1)
	{   
        if(q[pos % 2].empty())
		{
            pos++;
 
            while(!bfs1.empty())
			{
                auto [z, x, y] = bfs1.front();
                vis1[x][y] = 0;
                if(z!=0)
                bfs2.push({n, x, y});
                else
                    v.push_back({n-1, x, y});
 
                q[pos%2].push({x, y});
                bfs1.pop();
				    
//                debug(x);
//                debug(y);

                if(z<=0) continue;
 
                if(y - 1 >= 0 and !vis1[x][y - 1] and !vis2[x][y - 1])
				{
                    a[x][y-1] = '.';
                    vis2[x][y-1] = 1;
                    bfs1.push({z-1, x, y-1});
                }
                
                if(y + 1 < r and !vis1[x][y + 1] and !vis2[x][y + 1])
				{
                    a[x][y + 1] = '.';
                    vis2[x][y + 1] = 1;
                    bfs1.push({z - 1, x, y + 1});
                }
            }
 
            while(v.size())
			{
                bfs2.push(v.back());
                v.pop_back();
            }
            
            while(bfs2.size()){
                auto [z, x, y] = bfs2.front();
                vis1[x][y] = 0;
                bfs2.pop();
//                debug(x);
//                debug(y);
//                debug(z);
 
                if(z <= 0) continue;
                if(x - 1 >= 0 and !vis1[x - 1][y] and !vis2[x - 1][y])
				{
                    a[x - 1][y] = '.';
                    vis2[x - 1][y] = 1;
                    bfs2.push({z - 1, x - 1, y});
                }
                
                if(x + 1 < c and !vis1[x + 1][y] and !vis2[x + 1][y])
				{
                    a[x + 1][y] = '.';
                    vis2[x + 1][y] = 1;
                    bfs2.push({z - 1, x + 1, y});
                }
            }
 
            
        }
        else
		{
 
            while(q[pos % 2].size()){
                auto [x, y] = q[pos % 2].front();
                q[pos % 2].pop();
                int ans = 0;
                if(vis1[x][y]) continue;
 
                vis1[x][y] = 1;
                if(x == e[0] and y == e[1] and o == -1)
                    o = pos; 
 
                ans += check(x-1, y, pos);
                ans += check(x+1, y, pos);
                ans += check(x, y-1, pos);
                ans += check(x, y+1, pos);
                
                if(ans != 4)
                    bfs1.push({n, x, y});
            }
        }
 
 
    }
 	
// 	debug(ans);
 	
    cout << o << '\n';
 
} 

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:9:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    9 | #define For(i, n) for(int (i) = 0; (i) < (n); (i)++)
      |                           ^
Main.cpp:213:3: note: in expansion of macro 'For'
  213 |   For(i, c)
      |   ^~~
Main.cpp:9:27: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
    9 | #define For(i, n) for(int (i) = 0; (i) < (n); (i)++)
      |                           ^
Main.cpp:216:4: note: in expansion of macro 'For'
  216 |    For(j, r)
      |    ^~~
Main.cpp:9:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    9 | #define For(i, n) for(int (i) = 0; (i) < (n); (i)++)
      |                           ^
Main.cpp:229:3: note: in expansion of macro 'For'
  229 |   For(i, c)
      |   ^~~
Main.cpp:9:27: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
    9 | #define For(i, n) for(int (i) = 0; (i) < (n); (i)++)
      |                           ^
Main.cpp:236:4: note: in expansion of macro 'For'
  236 |    For(j, r)
      |    ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...