Submission #1240787

#TimeUsernameProblemLanguageResultExecution timeMemory
1240787trimkusFountain Parks (IOI21_parks)C++20
30 / 100
328 ms51352 KiB
#include "parks.h"
#include <bits/stdc++.h>

using namespace std;

struct DSU {
    vector<int> e;
    DSU (int n) {
        e = vector<int>(n, -1);
    }
    int get(int x) {
        return e[x] < 0 ? x : e[x] = get(e[x]);
    }
    int size(int x) {
        return -e[get(x)];
    }
    bool unite(int x, int y) {
        x = get(x);
        y = get(y);
        if (x == y) return false;
        if (e[x] > e[y]) swap(x, y);
        e[x] += e[y];
        e[y] = x;
        return true;
    }
};

int construct_roads(std::vector<int> x, std::vector<int> y) {
    int N = x.size();
    vector<map<int, int>> mp(N + 10);
    for (int i = 0; i < N; ++i) {
        mp[x[i]][y[i]] = i;
    }
    vector<map<int, int>> vis(N + 10);
    DSU dsu(N);
    vector<int> u, v, a, b;
    for (int i = 0; i < N; ++i) {
        if (mp[x[i]].count(y[i] + 2)) {
            int j = mp[x[i]][y[i] + 2];
            // cout << "x match:\n";
            // cout << x[i] << " " << y[i] << "\n";
            // cout << x[j] << " " << y[j] << "\n\n";
            dsu.unite(i, j);
            u.push_back(i);
            v.push_back(j);
            int ny = y[i] + 1;
            int nx;
            if (x[i] == 2) {
                nx = 1;
            } else if (x[i] == 6) {
                nx = 7;
            } else {
                if ((y[i] / 2) % 2) {
                    nx = 5;
                } else {
                    nx = 3;
                }
            }
            a.push_back(nx);
            b.push_back(ny);
            vis[nx][ny] = 1;
        }
    }
    for (int i = 0; i < N; ++i) {
        if (mp[x[i] + 2].count(y[i])) {
            int j = mp[x[i] + 2][y[i]];
            if (dsu.unite(i, j)) {
            //     cout << x[i] << " " << y[i] << "\n";
            // cout << x[j] << " " << y[j] << "\n\n";
                u.push_back(i);
                v.push_back(j);
                int nx = x[i] + 1;
                int ny = y[i] - 1;
                if (vis[nx].count(ny)) ny = y[i] + 1;
                assert(!vis[nx].count(ny));
                a.push_back(nx);
                b.push_back(ny);
                vis[nx][ny] = 1;
            }
        }
    }
    // cout << dsu.size(0) << "\n";
    if (dsu.size(0) != N) return 0;
    build(u, v, a, 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...