Submission #1179764

#TimeUsernameProblemLanguageResultExecution timeMemory
1179764repsakDrivers (BOI24_drivers)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long

vector<ll> back;
vector<ll> length;
vector<vector<ll>> costAdj;


ll findParent(ll b){
    while(back[b] != b){
        b = back[b];
    }

    return b;
}

bool possible(ll a, ll b){
    return findParent(a) == findParent(b);
}

void merge(ll a, ll b){
    ll pA = findParent(a);
    ll pB = findParent(b);
    if(pA == pB) return;

    if(length[pA] < length[pB]) swap(pA, pB);

    back[b] = a;
    length[a] += b;
}

int main(){
    ll N, M, Q;
    cin >> N >> M >> Q;

    back.resize(N + 1);
    length.resize(N + 1);

    for(ll i = 1; i <= N; i++){
        back[i] = i;
        length[i] = 1;
    }

    for(ll i = 0; i < M; i++){
        ll a, b, c;
        cin >> a >> b >> c;

        costAdj.push_back({c, a, b});
    }

    sort(costAdj.begin(), costAdj.end());

    vector<vector<ll>> queries(Q);
    for(ll i = 0; i < Q; i++){
        ll a, b, c;
        cin >> a >> b >> c;

        queries[i] = {c, a, b, i};
    }

    sort(queries.begin(), queries.end());

    // 1) Minimum spanning tree
    vector<ll> order(Q);
    ll iQ = 0;

    for(ll i = 0; i < costAdj.size(); i++){
        while(iQ < queries.size() && queries[iQ][0] <= costAdj[i][0]){
            if(possible(queries[iQ][1], queries[iQ][2])){
                order[queries[iQ][3]] = 1;
            }
            iQ++;
        }

        merge(costAdj[i][1], costAdj[i][2]);
    }

    for(ll i = 0; i < Q; i++){
        if(order[i]) cout << "TAIP\n";
        else 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...