Submission #372331

#TimeUsernameProblemLanguageResultExecution timeMemory
372331two_sidesBridges (APIO19_bridges)C++17
14 / 100
2545 ms122268 KiB
#include <bits/stdc++.h> using namespace std; struct item { int a, b, c; }; const int N = 100005; const int K = 700; int root[N], siz[N], ans[N]; vector <int> adj[N], pot[N], cur; queue <int> que; int id; bool vis[N], mark[N]; item edge[N], quer[N]; int Find(int u) { return root[u] == u ? u : root[u] = Find(root[u]); } void Union(int u, int v) { u = Find(u); v = Find(v); if (u == v) return; if (siz[u] < siz[v]) swap(u, v); siz[u] += siz[v]; root[v] = u; } int BFS(int u) { que.push(u); vis[u] = 1; int res = 0; cur.clear(); while (que.size()) { u = que.front(); que.pop(); cur.push_back(u); res += siz[u]; for (int v : adj[u]) if (!vis[v]) { vis[v] = 1; que.push(v); } } return res; } int main() { cin.tie(0)->sync_with_stdio(0); int n, m; cin >> n >> m; for (int i = 1; i <= m; i++) cin >> edge[i].a >> edge[i].b >> edge[i].c; int q; cin >> q; for (int i = 1; i <= q; i++) cin >> quer[i].a >> quer[i].b >> quer[i].c; for (int l = 1; l <= q; l += K) { int r = min(q, l + K - 1); fill_n(mark + 1, m, 0); iota(root + 1, root + n + 1, 1); fill_n(siz + 1, n, 1); vector <int> same, upd, ask; for (int i = l; i <= r; i++) if (quer[i].a == 1) mark[quer[i].b] = 1; else ask.push_back(i); for (int i = 1; i <= m; i++) if (!mark[i]) same.push_back(i); else upd.push_back(i); for (int i = l; i <= r; i++) { if (quer[i].a == 1) edge[quer[i].b].c = quer[i].c; else { for (int j : upd) if (edge[j].c >= quer[i].c) pot[i].push_back(j); } } sort(same.begin(), same.end(), [&](int i, int j) { return edge[i].c > edge[j].c; }); sort(ask.begin(), ask.end(), [&](int i, int j) { return quer[i].c > quer[j].c; }); int ptr = 0; for (int i : ask) { id = i; while (ptr < same.size() && edge[same[ptr]].c >= quer[i].c) { Union(edge[same[ptr]].a, edge[same[ptr]].b); ptr++; } for (int j : pot[i]) { int u = Find(edge[j].a); int v = Find(edge[j].b); adj[u].push_back(v); adj[v].push_back(u); } ans[i] = BFS(Find(quer[i].b)); for (int u : cur) { adj[Find(u)].clear(); vis[Find(u)] = 0; } } } for (int i = 1; i <= q; i++) if (quer[i].a == 2) cout << ans[i] << '\n'; }

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:87:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |             while (ptr < same.size() &&
      |                    ~~~~^~~~~~~~~~~~~
#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...