Submission #1228636

#TimeUsernameProblemLanguageResultExecution timeMemory
1228636kunzaZa183Bridges (APIO19_bridges)C++20
59 / 100
3091 ms28344 KiB
#include <bits/stdc++.h> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> u(m), v(m), w(m); for (int i = 0; i < m; i++) { cin >> u[i] >> v[i] >> w[i]; u[i]--, v[i]--; } int qs; cin >> qs; vector<int> type(qs), x1(qs), x2(qs); for (int i = 0; i < qs; i++) { cin >> type[i] >> x1[i] >> x2[i]; x1[i]--; } const int k = 316; vector<vector<int>> vvi(qs), adj(n); vector<int> tmpw(m), ans(qs, -1); vector<bool> visited(n); for (int chunk = 0; chunk * k < qs; chunk++) { vector<bool> changed(m, 0); vector<int> cureffects, ch, qries; for (int i = chunk * k; i < qs && i < (chunk + 1) * k; i++) if (type[i] == 1) { changed[x1[i]] = 1; ch.push_back(x1[i]); cureffects.push_back(i); } else { vvi[i] = cureffects; qries.push_back(i); } vector<int> noch; for (int i = 0; i < m; i++) if (!changed[i]) noch.push_back(i); sort(noch.begin(), noch.end(), [&](int a, int b) { return w[a] > w[b]; }); sort(qries.begin(), qries.end(), [&](int a, int b) { return x2[a] > x2[b]; }); vector<int> dsu(n), sz(n, 1); iota(dsu.begin(), dsu.end(), 0); auto par = [&](int in, auto &&sth) { if (dsu[in] == in) return in; return dsu[in] = sth(dsu[in], sth); }; int nochin = 0; for (auto a : qries) { while (nochin < noch.size() && (w[noch[nochin]] >= x2[a])) { if (par(u[noch[nochin]], par) != par(v[noch[nochin]], par)) { sz[par(u[noch[nochin]], par)] += sz[par(v[noch[nochin]], par)]; dsu[par(v[noch[nochin]], par)] = par(u[noch[nochin]], par); } nochin++; } for (auto b : ch) tmpw[b] = w[b]; for (auto b : vvi[a]) { tmpw[x1[b]] = x2[b]; } for (auto b : ch) if (tmpw[b] >= x2[a]) { adj[par(u[b], par)].push_back(par(v[b], par)); adj[par(v[b], par)].push_back(par(u[b], par)); } vector<int> visivi; vector<int> tmpvi2 = {par(x1[a], par)}; while (!tmpvi2.empty()) { int ok = tmpvi2.back(); tmpvi2.pop_back(); if (visited[ok]) continue; visited[ok] = 1; visivi.push_back(ok); for (auto b : adj[ok]) tmpvi2.push_back(b); } for (auto b : ch) if (tmpw[b] >= x2[a]) { adj[par(u[b], par)].clear(), adj[par(v[b], par)].clear(); } ans[a] = 0; for (auto b : visivi) { ans[a] += sz[b]; visited[b] = 0; } } for (auto a : cureffects) w[x1[a]] = x2[a]; } for (auto a : ans) if (a != -1) cout << a << "\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...
#Verdict Execution timeMemoryGrader output
Fetching results...