답안 #1096943

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1096943 2024-10-05T13:58:51 Z abczz 분수 공원 (IOI21_parks) C++17
0 / 100
1 ms 348 KB
#include "parks.h"
#include <iostream>
#include <map>
#include <array>
#include <queue>
#define ll long long

using namespace std;

map <array<ll, 2>, ll> mp;
map <array<ll, 2>, ll> visited;
map <array<ll, 2>, ll> pt;
map <array<ll, 3>, ll> edge;
queue <array<ll, 2>> Q;
vector <int> U, V, A, B;
ll dj[4][2] = {-1, -1, -1, 1, 1, 1, 1, -1}, dk[4][2] = {-2, 0, 0, 2, 2, 0, 0, -2};

void dfs(ll u, ll v) {
    ++visited[{u, v}];
    for (int i=0; i<4; ++i) {
        ll nx = u + dk[i][0], ny = v + dk[i][1];
        if (pt.count({nx, ny}) && !visited.count({nx, ny})) dfs(nx, ny);
    }
}

void solve(ll u, ll v) {
    for (int i=0; i<4; ++i) {
        if (edge.count({u, v, i})) {
            U.push_back(pt[{u + dj[i][0], v + dj[i][1]}]);
            V.push_back(pt[{u + dj[(i+1)%4][0], v + dj[(i+1)%4][1]}]);
            A.push_back(u);
            B.push_back(v);
            edge.erase({u, v, i});
            edge.erase({u + dk[i][0], v + dk[i][1], i ^ 2});
            solve(u + dk[i][0], v + dk[i][1]);
            break;
        }
    }
}

int construct_roads(std::vector<int> x, std::vector<int> y) {
    ll n = x.size();
    for (int i=0; i<n; ++i) {
        pt[{x[i], y[i]}] = i;
        for (int j=0; j<4; ++j) {
            ll nx = x[i] + dj[j][0], ny = y[i] + dj[j][1];
            ++mp[{nx, ny}];
        }
    }
    dfs(x[0], y[0]);
    if (visited.size() != pt.size()) return 0;
    for (auto it = mp.begin(); it != mp.end();) {
        auto nx = next(it);
        auto [u, v] = it->first;
        ll tot = 0;
        for (int i=0; i<4; ++i) {
            if (pt.count({u + dj[i][0], v + dj[i][1]}) && pt.count({u + dj[(i+1)%4][0], v + dj[(i+1)%4][1]})) {
                ++tot;
                ++edge[{u, v, i}];
            }
        }
        mp[{u, v}] = tot;
        if (tot == 0) mp.erase(it);
        else if (tot == 1) Q.push({u, v});
        it = nx;
    }
    while (!Q.empty()) {
        auto [u, v] = Q.front();
        Q.pop();
        if (!mp.count({u, v})) continue;
        for (int i=0; i<4; ++i) {
            if (edge.count({u, v, i})) {
                U.push_back(pt[{u + dj[i][0], v + dj[i][1]}]);
                V.push_back(pt[{u + dj[(i+1)%4][0], v + dj[(i+1)%4][1]}]);
                edge.erase({u + dk[i][0], v + dk[i][1], i ^ 2});
                --mp[{u + dk[i][0], v + dk[i][1]}];
                if (mp[{u + dk[i][0], v + dk[i][1]}] == 1) Q.push({u + dk[i][0], v + dk[i][1]});
                else if (mp[{u + dk[i][0], v + dk[i][1]}] == 0) mp.erase({u + dk[i][0], v + dk[i][1]});
            }
        }
        A.push_back(u);
        B.push_back(v);
    }
    for (auto [y, z] : mp) {
        if (z == 4) return 0;
    }
    for (auto [y, z] : mp) {
        auto [u, v] = y;
        solve(u, v);
    }
    build(U, V, A, B);
    return 1;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Edge between 1 and 0 appears more than once: appeared on positions 0 and 1
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Edge between 1 and 0 appears more than once: appeared on positions 0 and 1
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Edge between 1 and 0 appears more than once: appeared on positions 0 and 1
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Edge between 1 and 0 appears more than once: appeared on positions 0 and 1
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Edge between 1 and 0 appears more than once: appeared on positions 0 and 1
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Edge between 1 and 0 appears more than once: appeared on positions 0 and 1
3 Halted 0 ms 0 KB -