Submission #1214304

#TimeUsernameProblemLanguageResultExecution timeMemory
1214304spetrText editor (CEOI24_editor)C++20
0 / 100
4101 ms255680 KiB
#include <bits/stdc++.h> using namespace std; const int mmod = 998244353; #define vl vector<int> #define vint vector<vector<int>> int pow(int x, int n, int mod){ if (n == 0){ return 1; } int half = pow(x, n / 2, mod); int half_square = (half * half) % mod; if (n % 2 == 0) { return half_square; } else { return (half_square * x) % mod; } } int inversion_x(int x, int m){ int vysledek = pow(x,m-2); return vysledek; } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); int n; int sx,sy; int ex,ey; cin >> n; cin >> sy >> sx; cin >> ey >> ex; vl lines; for (int i = 0; i<n; i++){ int num; cin >> num; lines.push_back(num); } queue<vl> fronta; fronta.push({sx-1,sy-1,0}); set<pair<int,int>> visited; if (sx == ex && sy == ey) { cout << 0; return 0; } vint dirs {{1,0},{-1,0},{0,1},{0,-1}}; while (fronta.size() > 0){ vl prvek = fronta.front(); fronta.pop(); int x = prvek[0]; int y = prvek[1]; int dist = prvek[2]; if (x == ex-1 && y == (ey-1)){ cout << dist; break; } auto je = visited.find({x,y}); if (1 == 1){ int nx = x, ny = y; if (x > 0) { nx = x - 1; } else if (x == 0 && y > 0) { ny = y - 1; nx = lines[ny]; } else { nx = -1; // invalid } if (nx >= 0) { if (visited.find({nx,ny}) == visited.end()) { if (nx == ex-1 && ny == ey-1) { cout << dist + 1; return 0; } visited.insert({nx,ny}); fronta.push({nx, ny, dist + 1}); } } } // Move right { int nx = x, ny = y; if (x < lines[y]) { nx = x + 1; } else if (x == lines[y] && y < n - 1) { ny = y + 1; nx = 0; } else { nx = -1; // invalid } if (nx >= 0) { if (visited.find({nx,ny}) == visited.end()) { if (nx == ex-1 && ny == ey-1) { cout << dist + 1; return 0; } visited.insert({nx,ny}); fronta.push({nx, ny, dist + 1}); } } } // Move up if (y > 0) { int ny = y - 1; int nx = x > lines[ny] ? lines[ny] : x; if (visited.find({nx,ny}) == visited.end()) { if (nx == ex-1 && ny == ey-1) { cout << dist + 1; return 0; } visited.insert({nx,ny}); fronta.push({nx, ny, dist + 1}); } } // Move down if (y < n - 1) { int ny = y + 1; int nx = x > lines[ny] ? lines[ny] : x; if (visited.find({nx,ny}) == visited.end()) { if (nx == ex-1 && ny == ey-1) { cout << dist + 1; return 0; } visited.insert({nx,ny}); fronta.push({nx, ny, dist + 1}); } } } return 0; }
#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...