Submission #1159915

#TimeUsernameProblemLanguageResultExecution timeMemory
1159915rewqewDrivers (BOI24_drivers)C++17
0 / 100
2 ms2116 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

int pa[200005], sz[200005];

int Find(int a) {
    if (a == pa[a]) {
        return a;
    }
    pa[a] = pa[pa[a]];
    return pa[a];
}

bool Union(int a, int b) {
    a = Find(a);
    b = Find(b);
    if (a == b) {
        return false;
    }
    if (a < b) {
        std::swap(a, b);
    }
    pa[b] = a;
    sz[a] += sz[b];
    return true;
}

int main() {
    for (int i = 0; i < 200005; i++) {
        pa[i] = i;
        sz[i] = 1;
    }

    int n, m, u;
    std::cin >> n >> m >> u;
    std::vector<std::vector<int>> roads;
    for (int i = 0; i < m; i++) {
        int a, b, t;
        std::cin >> a >> b >> t;
        roads.push_back({t, a, b});
    }
    std::sort(roads.begin(), roads.end());

    std::vector<std::vector<int>> qu;
    std::vector<bool> ans(u, false);
    for (int i = 0; i < u; i++) {
        int a, b, p;
        std::cin >> a >> b >> p;
        qu.push_back({p, a, b, i});
    }
    std::sort(qu.begin(), qu.end());

    int qp = 0;
    for (int i = 0; i < m; i++) {
        if (qp < u) {
            while (qu[qp][0] < roads[i][0]) {
                ans[qu[qp][3]] = Find(qu[qp][1]) == Find(qu[qp][2]);
                qp++;
            }
        }
        Union(roads[i][1], roads[i][2]);
    }
    while (qp < u) {
        ans[qu[qp][3]] = Find(qu[qp][1]) == Find(qu[qp][2]);
        qp++;
    }

    for (int i = 0; i < u; i++) {
        if (ans[i]) {
            std::cout << "TAIP\n";
        }
        else {
            std::cout << "NE\n";
        }
    }
}
#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...