Submission #1252494

#TimeUsernameProblemLanguageResultExecution timeMemory
1252494tranvinhhuy2010Obstacles for a Llama (IOI25_obstacles)C++20
10 / 100
2094 ms9028 KiB
#include <vector> using namespace std; const int MAXM = 200005; int parent[MAXM]; int find(int x) { return parent[x] == x ? x : parent[x] = find(parent[x]); } void unite(int x, int y) { parent[find(x)] = find(y); } vector<int> T_global, H_global; vector<bool> free_cell; // free_cell[j] = T[0] > H[j] void initialize(vector<int> T, vector<int> H) { T_global = T; H_global = H; int M = H.size(); // mark which columns are free at row 0 free_cell.assign(M, false); for (int j = 0; j < M; ++j) { if (T[0] > H[j]) { free_cell[j] = true; } } // initialize DSU for (int j = 0; j < M; ++j) parent[j] = j; // merge adjacent free columns in row 0 for (int j = 0; j + 1 < M; ++j) { if (free_cell[j] && free_cell[j + 1]) { unite(j, j + 1); } } // check for vertical paths via other rows int N = T.size(); for (int i = 1; i < N; ++i) { int t = T[i]; int prev = -1; for (int j = 0; j < M; ++j) { if (t > H[j]) { if (free_cell[j]) { if (prev != -1) unite(prev, j); prev = j; } } else { prev = -1; } } } } bool can_reach(int L, int R, int S, int D) { if (find(S) != find(D)) return false; // check that all connectivity is within L to R if (S < L || S > R || D < L || D > R) return false; return true; }
#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...