Submission #401823

#TimeUsernameProblemLanguageResultExecution timeMemory
401823Jorge213Toll (APIO13_toll)C++17
100 / 100
1724 ms11940 KiB
#include <bits/stdc++.h> using namespace std; using pii = pair<int, int>; const int N = 1e5 + 10; const int K = 25; int a[N], comp[N]; long long p[K]; struct Edge { int u, v, w; bool operator<(const Edge &e) const { return w < e.w; } }; struct DSU { int dsu[N]; void clear(int n) { for (int i = 0; i <= n; i++) dsu[i] = i; } int root(int idx) { while (idx != dsu[idx]) { dsu[idx] = dsu[dsu[idx]]; idx = dsu[idx]; } return idx; } bool join(int a, int b) { if (root(a) == root(b)) return false; dsu[root(a)] = root(b); return true; } }; struct Tree { vector<pii> adjList[K]; int we[K], d[K], par[K]; long long cnt[N]; void clear(int n) { for (int i = 1; i <= n; i++) { adjList[i].clear(); cnt[i] = p[i]; } } void addEdge(int u, int v, int w) { adjList[u].push_back({v, w}); adjList[v].push_back({u, w}); } void dfs(int v, int p) { par[v] = p; d[v] = d[p] + 1; for (auto [u, w] : adjList[v]) { if (u == p) continue; dfs(u, v); we[u] = w; cnt[v] += cnt[u]; } } }; DSU dsu, ndsu; Tree g; int main() { int n, m, k; scanf("%d %d %d", &n, &m, &k); vector<Edge> edges, nedges; int ai, bi, ci; for (int i = 0; i < m; i++) { scanf("%d %d %d", &ai, &bi, &ci); edges.push_back({ai, bi, ci}); } sort(edges.begin(), edges.end()); int xi, yi; for (int i = 0; i < k; i++) { scanf("%d %d", &xi, &yi); nedges.push_back({xi, yi, 0}); } for (int i = 1; i <= n; i++) { scanf("%d", a + i); } int edgs = 0; dsu.clear(n); ndsu.clear(n); for (auto [u, v, w] : nedges) { if (ndsu.join(u, v)) edgs++; } for (auto [u, v, w] : edges) { if (ndsu.join(u, v)) { dsu.join(u, v); edgs++; if (edgs == n - 1) break; } } int sz = 0; for (int i = 1; i <= n; i++) { int v = dsu.root(i); if (!comp[v]) { comp[v] = ++sz; } comp[i] = comp[v]; } for (int i = 1; i <= n; i++) { p[comp[i]] += (long long) a[i]; } for (auto &[u, v, w] : nedges) { u = comp[u], v = comp[v]; } dsu.clear(sz); vector<Edge> mn; edgs = 0; for (auto [u, v, w] : edges) { if (dsu.join(comp[u], comp[v])) { mn.push_back({comp[u], comp[v], w}); edgs++; if (edgs == sz - 1) break; } } long long ans = 0; for (int bm = 1; bm < (1 << k); bm++) { dsu.clear(sz); g.clear(sz); for (int i = 0; i < k; i++) { if (!(bm & (1 << i))) continue; auto [u, v, w] = nedges[i]; if (dsu.join(u, v)) { g.addEdge(u, v, INT_MAX); } } vector<Edge> unused; for (auto [u, v, w] : mn) { if (dsu.join(u, v)) { g.addEdge(u, v, 0); } else { unused.push_back({u, v, w}); } } g.dfs(1, -1); for (auto [u, v, w] : unused) { if (g.d[u] < g.d[v]) swap(u, v); while (g.d[u] > g.d[v]) { g.we[u] = min(g.we[u], w); u = g.par[u]; } while (u != v) { g.we[u] = min(g.we[u], w); g.we[v] = min(g.we[v], w); u = g.par[u], v = g.par[v]; } } long long can = 0; for (int v = 1; v <= sz; v++) { can += 1LL * g.we[v] * g.cnt[v]; } ans = max(ans, can); } printf("%lld\n", ans); return 0; }

Compilation message (stderr)

toll.cpp: In function 'int main()':
toll.cpp:73:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |  scanf("%d %d %d", &n, &m, &k);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:79:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |   scanf("%d %d %d", &ai, &bi, &ci);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
toll.cpp:87:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |   scanf("%d %d", &xi, &yi);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~
toll.cpp:92:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   92 |   scanf("%d", a + i);
      |   ~~~~~^~~~~~~~~~~~~
toll.cpp:58:13: warning: array subscript -1 is below array bounds of 'int [25]' [-Warray-bounds]
   58 |   d[v] = d[p] + 1;
      |          ~~~^
toll.cpp:41:13: note: while referencing 'Tree::d'
   41 |  int we[K], d[K], par[K];
      |             ^
toll.cpp:69:6: note: defined here 'g'
   69 | Tree g;
      |      ^
#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...