제출 #1261576

#제출 시각아이디문제언어결과실행 시간메모리
1261576avighna장애물 (IOI25_obstacles)C++20
23 / 100
68 ms8264 KiB
#include <bits/stdc++.h> std::vector<int> h, t; int m; bool b(int i, int j) { return t[i] > h[j]; } int oned(int i, int j) { return i * m + j; } class UFDS { public: std::vector<int> par; int n; UFDS() {} UFDS(int n) : n(n), par(n) { std::iota(par.begin(), par.end(), 0); } int root(int u) { return u == par[u] ? u : par[u] = root(par[u]); } void merge(int u, int v) { u = root(u), v = root(v); if (u == v) { return; } par[v] = u; } }; UFDS dsu; void initialize(std::vector<int> T, std::vector<int> H) { h = H, t = T; m = h.size(); const int n = t.size(); dsu = UFDS(n * m); std::array<int, 4> dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1}; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { for (int k = 0; k < 4; ++k) { int x = i + dx[k], y = j + dy[k]; if (x < 0 or x >= n or y < 0 or y >= m) { continue; } if (b(i, j) and b(x, y)) { dsu.merge(oned(i, j), oned(x, y)); } } } } } bool can_reach(int l, int r, int s, int d) { return dsu.root(oned(0, s)) == dsu.root(oned(0, d)); }
#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...