Submission #1267344

#TimeUsernameProblemLanguageResultExecution timeMemory
1267344CrabCNHBridges (APIO19_bridges)C++20
100 / 100
1409 ms9288 KiB
#include <bits/stdc++.h> #define task "BriantheCrab" #define pii pair <int, int> #define fi first #define se second #define szf sizeof #define sz(s) (int)((s).size()) #define all(v) (v).begin(), (v).end() typedef long long ll; typedef unsigned long long ull; typedef long double ld; using namespace std; template <class T> void minimize (T &t, T f) {if (t > f) t = f;} template <class T> void maximize (T &t, T f) {if (t < f) t = f;} const int maxN = 1e5 + 5; const ll inf = 1e18 + 7; const int mod = 1e9 + 7; struct Edge { int u, v, w, id; }; struct Back { int u, v, szU; }; bool cmp (Edge A, Edge B) { return A.w > B.w; } bool cmpT (Edge A, Edge B) { return A.id < B.id; } int maxSz; int n, m; Edge ed[maxN]; vector <pii> change[maxN]; int res[maxN], par[maxN], sz[maxN]; vector <Back> hist; int ys[maxN], vis[maxN]; inline void init () { for (int i = 1; i <= n; i ++) { par[i] = i; sz[i] = 1; } hist.clear (); } int getRoot (int u) { if (par[u] == u) { return u; } return (getRoot (par[u])); } inline void merge (int u, int v) { u = getRoot (u); v = getRoot (v); if (u == v) { return; } if (sz[u] < sz[v]) { swap (u, v); } hist.push_back ({u, v, sz[u]}); par[v] = u; sz[u] += sz[v]; } inline void rollBack (int p) { while (sz (hist) > p) { auto [u, v, szU] = hist.back (); hist.pop_back (); par[v] = v; sz[u] = szU; } } int getVal (int id, int t) { if (sz (change[id]) == 0) { return ed[ys[id]].w; } int val = ed[ys[id]].w; int l = 0, r = sz (change[id]) - 1, pos = -1; while (true) { if (l > r) { break; } int mid = (l + r) >> 1; if (change[id][mid].se <= t) { pos = mid; l = mid + 1; } else { r = mid - 1; } } if (pos != -1) { val = change[id][pos].fi; } return val; } vector <Edge> o2; inline void calc () { init (); for (int i = 1; i <= m; i ++) { vis[i] = 0; } vector <int> dyn; for (int i = 1; i <= m; i ++) { if (sz (change[i])) { vis[i] = -1; dyn.push_back (i); } } sort (all (o2), cmp); int it = 1; for (int i = 0; i < sz (o2); i ++) { while (it <= m && ed[it].w >= o2[i].w) { if (!vis[ed[it].id]) { merge (ed[it].u, ed[it].v); } it ++; } int pos = sz (hist); for (int id : dyn) { int val = getVal (id, o2[i].id); if (val >= o2[i].w) { int idx = ys[id]; merge (ed[idx].u, ed[idx].v); } } res[o2[i].id] = sz[getRoot (o2[i].u)]; rollBack (pos); } for (int i = 1; i <= m; i ++) { if (sz (change[i])) { ed[ys[i]].w = change[i].back ().fi; change[i].clear (); vis[i] = 0; } } sort (ed + 1, ed + m + 1, cmp); for (int i = 1; i <= m; i ++) { ys[ed[i].id] = i; } o2.clear (); } void solve () { cin >> n >> m; for (int i = 1; i <= m; i ++) { int u, v, c; cin >> u >> v >> c; ed[i] = {u, v, c, i}; } sort (ed + 1, ed + m + 1, cmp); for (int i = 1; i <= m; i ++) { ys[ed[i].id] = i; } int q; cin >> q; maxSz = 1000; for (int i = 1; i <= q; i ++) { int t; cin >> t; if (i % maxSz == 0) { calc (); } if (t == 1) { int b, r; cin >> b >> r; change[b].push_back ({r, i}); } else { int s, w; cin >> s >> w; o2.push_back ({s, s, w, i}); } } calc (); for (int i = 1; i <= q; i ++) { if (res[i]) { cout << res[i] << '\n'; } } return; } signed main () { cin.tie (nullptr) -> sync_with_stdio (false); if (fopen (task".inp", "r")) { freopen (task".inp", "r", stdin); freopen (task".out", "w", stdout); } int t = 1; while (t --) { solve (); } return 0; }

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:203:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  203 |         freopen (task".inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:204:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  204 |         freopen (task".out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...