Submission #1196694

#TimeUsernameProblemLanguageResultExecution timeMemory
1196694mmaitiToy (CEOI24_toy)C++20
35 / 100
431 ms32580 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define vi vector<int> #define si set<int> #define usi unordered_set<int> #define sll set<ll> #define usll unordered_set<ll> #define vb vector<bool> #define vll vector<ll> #define pii pair<int, int> #define pll pair<ll, ll> #define vvi vector<vector<int>> #define vvll vector<vector<ll>> // xh, yh, xv, yv bool visited[90][90][90][90]; void solve() { int W, H, K, L; cin >> W >> H >> K >> L; int xh, yh, xv, yv, gx, gy; cin >> yh >> xh >> yv >> xv; vector<string> grid(H); for (int i = 0; i < H; i++) cin >> grid[i]; vector<vi> psum(H + 1, vi(W + 1)); for (int i = 0; i < H; i++) { for (int j = 0; j < W; j++) { if (grid[i][j] == '*') { gx = i; gy = j; } psum[i + 1][j + 1] = (grid[i][j] == 'X') + psum[i][j + 1] + psum[i + 1][j] - psum[i][j]; } } vll dx{-1, 0, 1, 0}; vll dy{0, 1, 0, -1}; queue<tuple<int, int, int, int>> q; q.push(make_tuple(xh, yh, xv, yv)); // x1, y1 are top left, x2, y2 are bottom right // all values are 0 indexed auto queryRegion = [&](ll x1, ll y1, ll x2, ll y2) { return psum[x2 + 1][y2 + 1] - psum[x1][y2 + 1] - psum[x2 + 1][y1] + psum[x1][y1]; }; auto checkCoord = [&](ll x, ll y) { return (x >= 0 && x < H && y >= 0 && y < W); }; // x1, y1 are horizontal piece; x2, y2 are vertical piece auto check = [&](ll x1, ll y1, ll x2, ll y2) { bool works = true; works &= checkCoord(x1, y1); works &= checkCoord(x1, y1 + K - 1); works &= checkCoord(x2, y2); works &= checkCoord(x2 + L - 1, y2); if (!works) return false; // check y coordinate intersection works &= !(y1 > y2 || y1 + K - 1 < y2); // check x coordinate intersection works &= !(x2 > x1 || x2 + L - 1 < x1); if (!works) return false; // check no obstacle intersection works &= (queryRegion(x1, y1, x1, y1 + K - 1) == 0); works &= (queryRegion(x2, y2, x2 + L - 1, y2) == 0); return works; }; while (!q.empty()) { int cxh, cyh, cxv, cyv; tie(cxh, cyh, cxv, cyv) = q.front(); /*cout << cxh << " " << cyh << " " << cxv << " " << cyv << endl;*/ q.pop(); if (cxh == gx && cyv == gy) { cout << "YES\n"; return; } for (int i = 0; i < 4; i++) { int nxh = cxh + dx[i]; int nyh = cyh + dy[i]; if (check(nxh, nyh, cxv, cyv) && !visited[nxh][nyh][cxv][cyv]) { visited[nxh][nyh][cxv][cyv] = true; q.push(make_tuple(nxh, nyh, cxv, cyv)); } } for (int i = 0; i < 4; i++) { int nxv = cxv + dx[i]; int nyv = cyv + dy[i]; if (check(cxh, cyh, nxv, nyv) && !visited[cxh][cyh][nxv][nyv]) { visited[cxh][cyh][nxv][nyv] = true; q.push(make_tuple(cxh, cyh, nxv, nyv)); } } } cout << "NO\n"; } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); solve(); }
#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...