Submission #742775

#TimeUsernameProblemLanguageResultExecution timeMemory
742775speedyArdaBridges (APIO19_bridges)C++14
27 / 100
213 ms13436 KiB
#include "bits/stdc++.h" using namespace std; const int MAXN = 1e5+5; vector< vector< pair<int, int> > > adj(MAXN); vector< pair<int, pair<int, int> > > edges; vector<bool> visited(MAXN); int par[MAXN], sz[MAXN]; int find(int v) { if(par[v] == v) return v; return par[v] = find(par[v]); } void merge(int a, int b) { a = find(a), b = find(b); if(a == b) return; if(sz[a] < sz[b]) swap(a, b); par[b] = a; sz[a] += sz[b]; } int dfs(int v, int weight, int p) { int ans = 1; visited[v] = true; for(pair<int, int> e : adj[v]) { if(visited[e.first] || e.second < weight) continue; ans += dfs(e.first, weight, v); } return ans; } int main() { int n, m; cin >> n >> m; for(int i = 1; i <= m; i++) { int f, s, w; cin >> f >> s >> w; adj[f].push_back({s, w}); adj[s].push_back({f, w}); edges.push_back({w, {f, s}}); } int q; cin >> q; if(max(m, n) <= 1000 && q <= 10000) // Subtask 1 { for(int i = 1; i <= q; i++) { int f, s, t; cin >> f >> s >> t; if(f == 1) { s--; int from = edges[s].second.first, to = edges[s].second.second; for(int l = 0; l < adj[from].size(); l++) { if(adj[from][l].first == to && adj[from][l].second == edges[s].first) { adj[from][l].second = t; break; } } for(int l = 0; l < adj[to].size(); l++) { if(adj[to][l].first == from && adj[to][l].second == edges[s].first) { adj[to][l].second = t; break; } } edges[s].first = t; } else { for(int i = 0; i <= n; i++) visited[i] = false; int ans = dfs(s, t, -1); cout << ans << "\n"; } } } else //Subtask 4 { for(int i = 1; i <= n; i++) { sz[i] = 1; par[i] = i; } sort(edges.begin(), edges.end()); reverse(edges.begin(), edges.end()); int idx = 0; vector< pair<int, pair<int, int> > > queries; vector<int> ans(q+5, 0); for(int i = 1; i <= q; i++) { int f, s, t; cin >> f >> s >> t; queries.push_back({t, {s, i}}); } sort(queries.begin(), queries.end()); reverse(queries.begin(), queries.end()); for(int i = 0; i < q; i++) { while(idx < m && edges[idx].first >= queries[i].first) { merge(edges[idx].second.first, edges[idx].second.second); idx++; } ans[queries[i].second.second] = sz[find(queries[i].second.first)]; } for(int i = 1; i <= q; i++) cout << ans[i] << "\n"; } }

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:62:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |                 for(int l = 0; l < adj[from].size(); l++)
      |                                ~~^~~~~~~~~~~~~~~~~~
bridges.cpp:69:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |                 for(int l = 0; l < adj[to].size(); l++)
      |                                ~~^~~~~~~~~~~~~~~~
#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...