제출 #1332446

#제출 시각아이디문제언어결과실행 시간메모리
13324462sqrt3Island Hopping (JOI24_island)C++20
65 / 100
4 ms400 KiB
#include "island.h"
#include <vector>

using namespace std;
struct DSU {
    vector<int> parent;
    
    DSU(int n) {
        parent.resize(n + 1);
        for (int i = 1; i <= n; ++i) {
            parent[i] = i;
        }
    }
    
    int find(int i) {
        if (parent[i] == i)
            return i;
        return parent[i] = find(parent[i]);
    }
    
    bool unite(int i, int j) {
        int root_i = find(i);
        int root_j = find(j);
        if (root_i != root_j) {
            parent[root_i] = root_j;
            return true;
        }
        return false;
    }
    
    bool same(int i, int j) {
        return find(i) == find(j);
    }
};

void solve(int N, int L) {
    DSU dsu(N);
    vector<int> ptr(N + 1, 1);
    vector<int> path;
    path.push_back(1); 
    int edges = 0;
    while (edges < N - 1) {
        int u = path.back();
        int v = query(u, ptr[u]++);
        if (dsu.same(u, v)) {
            continue;
        }
        int comp_v = dsu.find(v);
        if (path.size() >= 2 && dsu.find(path[path.size() - 2]) == comp_v) {
            answer(u, v);
            edges++;
            dsu.unite(u, v);
            path.pop_back();
        } else {
            path.push_back(v);
        }
    }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...