Submission #1179753

#TimeUsernameProblemLanguageResultExecution timeMemory
1179753repsakDrivers (BOI24_drivers)C++20
0 / 100
0 ms528 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long vector<int> back; vector<int> length; vector<vector<int>> costAdj; int findParent(int b){ while(back[b] != b){ b = back[b]; } return b; } bool possible(int a, int b){ return findParent(a) == findParent(b); } void merge(int a, int b){ int pA = findParent(a); int pB = findParent(b); if(pA == pB) return; if(length[pA] < length[pB]) swap(pA, pB); back[b] = a; length[a] += b; } int main(){ int N, M, Q; cin >> N >> M >> Q; back.resize(N + 1); length.resize(N + 1); for(int i = 1; i <= N; i++){ back[i] = i; length[i] = 1; } for(int i = 0; i < M; i++){ int a, b, c; cin >> a >> b >> c; costAdj.push_back({c, a, b}); } sort(costAdj.begin(), costAdj.end()); vector<vector<int>> queries(Q); for(int i = 0; i < Q; i++){ int a, b, c; cin >> a >> b >> c; queries[i] = {c, a, b, i}; } sort(queries.begin(), queries.end()); // 1) Minimum spanning tree vector<int> order(Q); int iQ = 0; for(int i = 0; i < costAdj.size(); i++){ if(iQ < queries.size() && queries[iQ][0] <= costAdj[i][0]){ merge(costAdj[i][1], costAdj[i][2]); } 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(int 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...