Submission #1345793

#TimeUsernameProblemLanguageResultExecution timeMemory
1345793killerzaluuBridges (APIO19_bridges)C++20
14 / 100
42 ms3912 KiB
#include <bits/stdc++.h>
using namespace std;

struct Edge {
    int u, v, d;
};

struct Query {
    int s, w, id;
};

int p[500005], sz[500005];

int find_set(int v) {
    if (p[v] == v) return v;
    return p[v] = find_set(p[v]);
}

void unite(int a, int b) {
    a = find_set(a);
    b = find_set(b);
    if (a == b) return;
    if (sz[a] < sz[b]) swap(a, b);
    p[b] = a;
    sz[a] += sz[b];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<Edge> edges(m);
    for (int i = 0; i < m; i++) {
        cin >> edges[i].u >> edges[i].v >> edges[i].d;
    }

    int q;
    cin >> q;

    vector<Query> queries;
    queries.reserve(q);

    for (int i = 0; i < q; i++) {
        int t, s, w;
        cin >> t >> s >> w;
        queries.push_back({s, w, i});
    }

    sort(edges.begin(), edges.end(), [&](Edge a, Edge b) {
        return a.d > b.d;
    });

    sort(queries.begin(), queries.end(), [&](Query a, Query b) {
        return a.w > b.w;
    });

    for (int i = 1; i <= n; i++) {
        p[i] = i;
        sz[i] = 1;
    }

    vector<int> ans(q);
    int j = 0;

    for (auto qu : queries) {
        while (j < m && edges[j].d >= qu.w) {
            unite(edges[j].u, edges[j].v);
            j++;
        }
        ans[qu.id] = sz[find_set(qu.s)];
    }

    for (int i = 0; i < q; i++) {
        cout << ans[i] << '\n';
    }

    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...