제출 #1213364

#제출 시각아이디문제언어결과실행 시간메모리
1213364omsincoconutFountain Parks (IOI21_parks)C++17
50 / 100
1629 ms180972 KiB
#include "parks.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> x, y;
map<pair<int, int>, int> pos_idx;
map<pair<int, int>, int> edge_side;
set<pair<int, int>> vis, benched;
set<pair<int, int>> bench_used;
vector<int> ret_u, ret_v, ret_a, ret_b;

int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

void dfs(int u, int ent) {
    int xu = x[u], yu = y[u];

    for (int id = 0; id < 4; id++) {
        int i = (ent+id+1)%4;
        int xv = x[u] + 2*dx[i], yv = y[u] + 2*dy[i];
        if (!pos_idx.count({xv, yv})) continue;
        int v = pos_idx[{xv, yv}];

        if (vis.count({u, v})) continue;

        if (benched.count({v, u})) {
            vis.insert({u, v});
            dfs(v, i);
            continue;
        }

        int bx, by;

        if (dx[i] == 1) {
            bx = xu + dx[i];
            by = yu + 1;
        } else if (dx[i] == -1) {
            bx = xu + dx[i];
            by = yu - 1;
        } else if (dy[i] == 1) {
            bx = xu - 1;
            by = yu + dy[i];
        } else if (dy[i] == -1) {
            bx = xu + 1;
            by = yu + dy[i];
        }

        if (!bench_used.count({bx, by})) {
            ret_u.push_back(u);
            ret_v.push_back(v);
            ret_a.push_back(bx);
            ret_b.push_back(by);
            bench_used.insert({bx, by});
            benched.insert({u, v});
        }

        vis.insert({u, v});
        dfs(v, i);
    }
}

int construct_roads(vector<int> _x, vector<int> _y) {
    x = _x; y = _y;
    int n = x.size();
    for (int i = 0; i < n; i++) pos_idx[{x[i], y[i]}] = i;

    int start = 0;
    for (int i = 0; i < n; i++) {
        if (make_pair(y[i], -x[i]) > make_pair(y[start], -x[start])) start = i;
    }

    dfs(start, 0);

    // Check connectivity
    vector<vector<int>> edge_used(n, vector<int>());
    for (int i = 0; i < ret_u.size(); i++) {
        edge_used[ret_u[i]].push_back(ret_v[i]);
        edge_used[ret_v[i]].push_back(ret_u[i]);
    }

    vector<bool> visited(n);
    queue<int> bfs;
    bfs.push(0);
    while (!bfs.empty()) {
        int u = bfs.front();
        bfs.pop();
        if (visited[u]) continue;
        visited[u] = true;

        for (int v : edge_used[u]) bfs.push(v);
    }

    for (int i = 0; i < n; i++) if (!visited[i]) return 0;

    build(ret_u, ret_v, ret_a, ret_b);
    return 1;
}
#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...