Submission #1036185

#TimeUsernameProblemLanguageResultExecution timeMemory
1036185vjudge1Islands (IOI08_islands)C++17
100 / 100
376 ms131072 KiB
#include <stdio.h> #define NN 1000001 #define MM 2000002 long long max(long long i, long long j) {return i > j ? i : j;} int n, ww[MM], to[MM], lnk[MM], head[NN]; void link(int u, int v, int w) { static int ii = 1; int i = ++ii; to[i] = v; ww[i] = w; lnk[i] = head[u]; head[u] = i; } int cycle_head, cycle_tail, cyc[NN], co, par[NN]; char incyc[NN]; long long tentacle[NN], tentacle2[NN], aa[NN], here; int dfs(int u, int pe) { for (int j = head[u]; j; j = lnk[j]) if (j / 2 - pe / 2) { int v = to[j]; if (par[v]) { cycle_head = u; cycle_tail = v; co = 0; int cur = u; for (; cur != v && cur != -1; cur = par[cur]) incyc[cyc[co++] = cur] = 1; incyc[cyc[co++] = v] = 1; return 1; } par[v] = u; if (dfs(v, j)) return 1; } return 0; } void dfs2(int u, int p) { par[u] = p; for (int j = head[u]; j; j = lnk[j]) { int v = to[j]; if (v == p || incyc[v]) continue; dfs2(v, u); if (tentacle[v] + ww[j] >= tentacle[u]) tentacle2[u] = tentacle[u], tentacle[u] = tentacle[v] + ww[j]; else if (tentacle[v] + ww[j] >= tentacle2[u]) tentacle2[u] = tentacle[v] + ww[j]; } here = max(here, tentacle[u]+ tentacle2[u]); } long long answer = 0; int main() { scanf("%d", &n); for (int i = 1, j, k; i <= n; ++i) scanf("%d%d", &j, &k), link(i, j, k), link(j, i, k); for (int ii = 1; ii <= n; ++ii) { if (par[ii]) continue; par[ii] = -1; dfs(ii, -1); long long op0 = -1e18, op1 = -1e18; here = 0; long long cycle_w = 0; for (int i = 0; i < co; ++i) { for (int j = head[cyc[i]]; j; j = lnk[j]) if (incyc[to[j]]) cycle_w += ww[j]; dfs2(cyc[i], -1); } cycle_w /= 2; for (int i = 0; i < co; ++i) { here = max(here, tentacle[cyc[i]] + max(aa[i] + op0, -aa[i] + op1)); op0 = max(tentacle[cyc[i]] - aa[i], op0); op1 = max(tentacle[cyc[i]] + cycle_w + aa[i], op1); if (i + 1 < co) for (int j = head[cyc[i]]; j; j = lnk[j]) if (to[j] == cyc[i + 1]) { aa[i + 1] = aa[i] + ww[j]; break; } } answer += here; } printf("%lld\n", answer); }

Compilation message (stderr)

islands.cpp: In function 'int main()':
islands.cpp:64:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
islands.cpp:66:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |         scanf("%d%d", &j, &k), link(i, j, k), link(j, i, k);
      |         ~~~~~^~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...