Submission #614107

#TimeUsernameProblemLanguageResultExecution timeMemory
614107dxz05Fountain Parks (IOI21_parks)C++17
100 / 100
811 ms56696 KiB
#include "parks.h"
#include <bits/stdc++.h>

using namespace std;
#define MP make_pair
#define all(x) (x).begin(), (x).end()

struct dsu {
    vector<int> p, sz;
    dsu(int n) {
        p.assign(n, 0);
        sz.assign(n, 1);
        iota(p.begin(), p.end(), 0);
    }

    int find(int x) {
        return (x == p[x] ? x : p[x] = find(p[x]));
    }

    bool unite(int x, int y) {
        x = find(x);
        y = find(y);
        if (x == y) return false;
        if (sz[x] > sz[y]) swap(x, y);
        p[x] = y;
        sz[y] += sz[x];
        return true;
    }
};

int construct_roads(vector<int> x, vector<int> y) {
    int n = (int)x.size();
    if (n == 1) {
	    build({}, {}, {}, {});
        return 1;
    }

    map<pair<int, int>, int> id;
    set<pair<int, int>> benches;
    for (int i = 0; i < n; i++){
        id[MP(x[i], y[i])] = i;
        benches.insert(MP(x[i] - 1, y[i] - 1));
        benches.insert(MP(x[i] - 1, y[i] + 1));
        benches.insert(MP(x[i] + 1, y[i] - 1));
        benches.insert(MP(x[i] + 1, y[i] + 1));
    }

    vector<int> U, V, A, B;
    dsu d(n);
    
    for (pair<int, int> bench : benches){
        int a = bench.first, b = bench.second;
        
        int par = ((a - 1) / 2 + (b - 1) / 2) % 2;

        // cerr << a << ' ' << b << ' ' << par << endl;

        if (par){ // down, up
            int i = -1, j = -1;
            if (id.find(MP(a - 1, b - 1)) != id.end()) i = id[MP(a - 1, b - 1)];
            if (id.find(MP(a + 1, b - 1)) != id.end()) j = id[MP(a + 1, b - 1)];
            if (i != -1 && j != -1 && d.unite(i, j)){
                U.push_back(i);
                V.push_back(j);
                A.push_back(a);
                B.push_back(b);
                continue;                
            }

            i = -1, j = -1;
            if (id.find(MP(a - 1, b + 1)) != id.end()) i = id[MP(a - 1, b + 1)];
            if (id.find(MP(a + 1, b + 1)) != id.end()) j = id[MP(a + 1, b + 1)];
            if (i != -1 && j != -1 && d.unite(i, j)) {
                U.push_back(i);
                V.push_back(j);
                A.push_back(a);
                B.push_back(b);
                continue;
            }

        } else { // left, right
            int i = -1, j = -1;
            if (id.find(MP(a - 1, b - 1)) != id.end()) i = id[MP(a - 1, b - 1)];
            if (id.find(MP(a - 1, b + 1)) != id.end()) j = id[MP(a - 1, b + 1)];
            if (i != -1 && j != -1 && d.unite(i, j)) {
                U.push_back(i);
                V.push_back(j);
                A.push_back(a);
                B.push_back(b);
                continue;
            }

            i = -1, j = -1;
            if (id.find(MP(a + 1, b - 1)) != id.end()) i = id[MP(a + 1, b - 1)];
            if (id.find(MP(a + 1, b + 1)) != id.end()) j = id[MP(a + 1, b + 1)];
            if (i != -1 && j != -1 && d.unite(i, j)) {
                U.push_back(i);
                V.push_back(j);
                A.push_back(a);
                B.push_back(b);
                continue;
            }
        }

    }

    if ((int)U.size() == n - 1){
        build(U, V, A, B);
        return 1;
    }
    
    return 0;
}
#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...