제출 #265034

#제출 시각아이디문제언어결과실행 시간메모리
265034KoD다리 (APIO19_bridges)C++11
73 / 100
3034 ms6540 KiB
#include <iostream> #include <algorithm> #include <utility> #include <cstdint> #include <cstddef> #include <vector> #include <array> #include <stack> using i32 = int32_t; using i64 = int64_t; using u32 = uint32_t; using u64 = uint64_t; constexpr i32 inf32 = (i32(1) << 30) - 1; constexpr i64 inf64 = (i64(1) << 62) - 1; constexpr size_t BUCKET = 800; constexpr size_t VERTICES = 50000; constexpr size_t EDGES = 100000; constexpr size_t QUERIES = 100000; size_t N, M, Q, Step; std::array<i32, VERTICES> parent; std::array<i32, EDGES> U, V, C; std::array<bool, EDGES> Static; struct Query { i32 type, idx, weight; }; std::array<Query, QUERIES> Qs; std::vector<i32> static_query, dynamic_query; std::array<i32, QUERIES> answer; i32 find(i32 u) { while (parent[u] >= 0) { u = parent[u]; } return u; } void merge(i32 u, i32 v) { u = find(u); v = find(v); if (u == v) { return; } if (parent[u] > parent[v]) { std::swap(u, v); } parent[u] += parent[v]; parent[v] = u; } void dfs(const std::vector<i32> &query, const size_t ans, const size_t cur) { if (cur == query.size()) { answer[ans] = -parent[find(Qs[ans].idx)]; return; } if (C[Qs[query[cur]].idx] < Qs[ans].weight) { dfs(query, ans, cur + 1); return; } i32 u = find(U[Qs[query[cur]].idx]); i32 v = find(V[Qs[query[cur]].idx]); if (u == v) { dfs(query, ans, cur + 1); return; } if (parent[u] > parent[v]) { std::swap(u, v); } const i32 a = parent[u]; const i32 b = parent[v]; parent[u] += parent[v]; parent[v] = u; dfs(query, ans, cur + 1); parent[u] = a; parent[v] = b; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cin >> N >> M; for (size_t i = 0; i < M; ++i) { std::cin >> U[i] >> V[i] >> C[i]; --U[i]; --V[i]; } std::cin >> Q; Step = (Q + BUCKET - 1) / BUCKET; for (size_t i = 0; i < Q; ++i) { std::cin >> Qs[i].type >> Qs[i].idx >> Qs[i].weight; --Qs[i].idx; } std::fill(Static.begin(), Static.end(), true); static_query.reserve(M + BUCKET); dynamic_query.reserve(BUCKET); for (size_t step = 0; step < Step; ++step) { std::fill(parent.begin(), parent.begin() + N, -1); const size_t first = step * BUCKET; const size_t last = std::min((step + 1) * BUCKET, Q); for (size_t i = first; i < last; ++i) { if (Qs[i].type == 1) { Static[Qs[i].idx] = false; dynamic_query.push_back((i32) i); } else { static_query.push_back(-((i32) i + 1)); } } for (size_t i = 0; i < M; ++i) { if (Static[i]) { static_query.push_back((i32) i); } } std::sort(static_query.begin(), static_query.end(), [](i32 i, i32 j) { if (i >= 0 && j >= 0) { return C[i] > C[j]; } else if (i >= 0) { if (C[i] == Qs[-(j + 1)].weight) { return true; } return C[i] > Qs[-(j + 1)].weight; } else if (j >= 0) { if (Qs[-(i + 1)].weight == C[j]) { return false; } return Qs[-(i + 1)].weight > C[j]; } else { return Qs[-(i + 1)].weight > Qs[-(j + 1)].weight; } }); for (auto i: static_query) { if (i >= 0) { merge(U[i], V[i]); } else { i = -(i + 1); std::stack<std::pair<i32, i32>> fix; for (auto j: dynamic_query) { if (j > i) { break; } fix.emplace(Qs[j].idx, C[Qs[j].idx]); C[Qs[j].idx] = Qs[j].weight; } dfs(dynamic_query, i, 0); while (!fix.empty()) { C[fix.top().first] = fix.top().second; fix.pop(); } } } for (size_t i = first; i < last; ++i) { if (Qs[i].type == 1) { C[Qs[i].idx] = Qs[i].weight; Static[Qs[i].idx] = true; } } static_query.clear(); dynamic_query.clear(); } for (auto x: answer) { if (x != 0) { std::cout << x << '\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...