Submission #1251589

#TimeUsernameProblemLanguageResultExecution timeMemory
1251589fv3Obstacles for a Llama (IOI25_obstacles)C++20
0 / 100
59 ms9796 KiB
#include "obstacles.h"
#include <bits/stdc++.h>

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

struct union_find {
    vector<int> sz, lft;

    union_find(int n) {
        sz = lft = vector<int>(n, 1);
        iota(all(lft), 0);
    }

    int find(int i) {
        if (lft[i] == i) return i;
        return lft[i] = find(lft[i]);
    }

    void merge(int a, int b) {
        a = find(a); b = find(b);
        if (a == b) return;

        if (sz[a] < sz[b]) {
            swap(a, b);
        }
        lft[b] = a;
        sz[a] += sz[b];
    }
} dsu(0);

void initialize(vector<int> T, vector<int> H) {
    const int N = int(T.size());
    const int M = int(H.size());

    assert(N <= 3);
    dsu = union_find(N * M);

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (T[i] <= H[j]) continue;
            if (j < M - 1 && T[i] > H[j + 1]) {
                dsu.merge(i * M + j, i * M + j + 1);
            }
            if (i < N - 1 && T[i+1] > H[j]) {
                dsu.merge(i * M + j, i * M + j + M);
            }
        }
    }
}

bool can_reach(int L, int R, int S, int D) {
    return dsu.find(R) == dsu.find(S);
}

//#include "grader.cpp"
#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...