Submission #1283156

#TimeUsernameProblemLanguageResultExecution timeMemory
1283156abc123Drivers (BOI24_drivers)C++20
100 / 100
293 ms13580 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Edge {
    int t, x, y;
};

struct Query {
    int a, b, p, idx;
};

vector<int> par;

int find(int x) {
    if (par[x] != x) par[x] = find(par[x]);
    return par[x];
}

void unite(int x, int y) {
    x = find(x); y = find(y);
    if (x != y) par[x] = y;
}

int main() {
    int N, M, U;
    cin >> N >> M >> U;
    vector<Edge> edges(M);
    for (int i = 0; i < M; ++i)
        cin >> edges[i].x >> edges[i].y >> edges[i].t;

    vector<Query> queries(U);
    for (int i = 0; i < U; ++i) {
        cin >> queries[i].a >> queries[i].b >> queries[i].p;
        queries[i].idx = i; // preserve order
    }
    sort(edges.begin(), edges.end(), [](Edge a, Edge b){ return a.t < b.t; });
    sort(queries.begin(), queries.end(), [](Query a, Query b){ return a.p < b.p; });

    par.resize(N + 1);
    for (int i = 1; i <= N; ++i) par[i] = i;

    vector<string> answer(U);
    int edge_i = 0;
    for (const auto& q : queries) {
        // Activate all roads <= current p
        while (edge_i < M && edges[edge_i].t <= q.p) {
            unite(edges[edge_i].x, edges[edge_i].y);
            ++edge_i;
        }
        if (find(q.a) == find(q.b)) answer[q.idx] = "TAIP";
        else answer[q.idx] = "NE";
    }
    for (auto& ans : answer) cout << ans << '\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...