제출 #1306576

#제출 시각아이디문제언어결과실행 시간메모리
1306576anangoObstacles for a Llama (IOI25_obstacles)C++20
10 / 100
1177 ms2162688 KiB
#include "obstacles.h" #include <bits/stdc++.h> using namespace std; #define int long long vector<vector<int>> grid; int n,m; //N=2 for subtask 2 vector<int> DX = {-1,1,0,0}; vector<int> DY = {0,0,-1,1}; class DSU { public: int n0; vector<int> par; vector<int> size; DSU(int sz) { n0 = sz; size = vector<int>(n0,1); par=vector<int>(n0); iota(par.begin(), par.end(), (int)0); } int find(int u) { if (u==par[u]) return u; return par[u] = find(par[u]); } void link(int u, int v) { u = find(u); v = find(v); if (size[u]<size[v]) swap(u,v); if (u==v) return; //skip size[u] += size[v]; size[v] = 0; par[v] = u; } }; DSU dsu(0); void initialize(std::vector<signed> T, std::vector<signed> H) { //subtask 1, 3 n = T.size(); m = H.size(); grid = vector<vector<int>>(n, vector<int>(m,0)); for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { grid[i][j] = T[i] > H[j]; } } dsu = DSU(n*m); for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { if (grid[i][j]==0) continue; for (int d=0; d<4; d++) { int ni = i + DX[d]; int nj = j + DY[d]; if (0<=ni && ni<n && 0<=nj && nj<m) { if (grid[ni][nj] == 1) dsu.link(m*i+j, m*ni+nj); } } } } return; } bool can_reach(signed L, signed R, signed S, signed D) { assert(L==0); assert(R==m-1); //check that (0, S) and (0, D) are in the same component, this is fine because the IDs are 0*m+S, 0*m+D bool connected = dsu.find(S) == dsu.find(D); return connected; }
#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...