Submission #487193

#TimeUsernameProblemLanguageResultExecution timeMemory
487193MilosMilutinovicFountain Parks (IOI21_parks)C++17
5 / 100
70 ms6996 KiB
#include "parks.h"
#include <bits/stdc++.h>
using namespace std;

struct ds {
    vector<int> fa;
    ds(int n) {
        fa.resize(n);
        iota(fa.begin(), fa.end(), 0);
    }
    int gfa(int x) {
        return fa[x] == x ? x : fa[x] = gfa(fa[x]);
    }
    void unite(int x, int y) {
        x = gfa(x), y = gfa(y);
        if (x == y) return;
        fa[x] = y;
    }
};

//void build(vector<int> v, vector<int> u, vector<int> a, vector<int> b) {}

int construct_roads(std::vector<int> x, std::vector<int> y) {
    if (x.size() == 1) {
        build({}, {}, {}, {});
        return 1;
    }
    int n = x.size();
    int mn = *min_element(x.begin(), x.end());
    int mx = *min_element(x.begin(), x.end());
    if (mn == 2 && mx == 2) {
        int p[n];
        for (int i = 0; i < n; i++) p[i] = i;
        sort(p, p + n, [&](int i, int j) {
            return y[i] < y[j];
        });
        for (int i = 0; i + 1 < n; i++)
            if (y[p[i]] + 2 != y[p[i + 1]])
                return 0;
        vector<int> u, v, a, b;
        for (int i = 0; i + 1 < n; i++) {
            u.push_back(p[i]);
            v.push_back(p[i + 1]);
            a.push_back(x[i] - 1);
            b.push_back(y[p[i]] + 1);
        }
        build(u, v, a, b);
        return 1;
    }
    if (mn == 2 && mx == 4) {
        map<pair<int, int>, int> id;
        for (int i = 0; i < n; i++) {
            id[{x[i], y[i]}] = i + 1;
        }
        ds d(n);
        for (int i = 0; i < n; i++) {
            if (id[{x[i] + 2, y[i]}]) {
                d.unite(i, id[{x[i] + 2, y[i]}] - 1);
            }
            if (id[{x[i], y[i] + 2}]) {
                d.unite(i, id[{x[i], y[i] + 2}] - 1);
            }
        }
        for (int i = 0; i < n; i++)
            if (d.gfa(i) != d.gfa(0))
                return 0;
        vector<int> u, v, a, b;
        for (int i = 0; i < n; i++) {
            if (id[{x[i] + 2, y[i]}]) {
                u.push_back(i);
                v.push_back(id[{x[i] + 2, y[i]}] - 1);
                a.push_back(x[i] + 1);
                b.push_back(y[i] + 1);
            }
            if (id[{x[i], y[i] + 2}]) {
                u.push_back(i);
                v.push_back(id[{x[i], y[i] + 2}] - 1);
                a.push_back(x[i] == 2 ? x[i] - 1 : x[i] + 1);
                b.push_back(y[i] + 1);
            }
        }
        build(u, v, a, b);
        return 1;
    }
}

Compilation message (stderr)

parks.cpp: In function 'int construct_roads(std::vector<int>, std::vector<int>)':
parks.cpp:85:1: warning: control reaches end of non-void function [-Wreturn-type]
   85 | }
      | ^
#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...