제출 #1036149

#제출 시각아이디문제언어결과실행 시간메모리
1036149sleepntsheepIslands (IOI08_islands)C11
48 / 100
202 ms112464 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], col[NN]; void link(int u, int v, int w) { static int ii = 0; int i = ++ii; to[i] = v; ww[i] = w; lnk[i] = head[u]; head[u] = i; } int cycle_head, cycle_tail; int cyc[NN], co, par[NN], incyc[NN]; long long tentacle[NN], aa[NN]; int dfs(int u, int p) { par[u] = p; col[u] = 1; for (int j = head[u]; j; j = lnk[j]) { int v = to[j]; if (v == p) continue; if (col[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; } if (dfs(v, u)) return 1; } return 0; } void dfs2(int u, int p) { col[u] = 1; for (int j = head[u]; j; j = lnk[j]) { int v = to[j]; if (v == p || incyc[v]) continue; dfs2(v, u); tentacle[u] = max(tentacle[u], tentacle[v] + ww[j]); } } 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 (col[ii]) continue; 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; if (co == 2) { for (int j = head[cycle_head]; j; j = lnk[j]) if (cycle_tail == to[j]) here = max(here, ww[j]); answer += here + tentacle[cycle_tail] + tentacle[cycle_head]; continue; } 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); }

컴파일 시 표준 에러 (stderr) 메시지

islands.c: In function 'main':
islands.c:61:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |     scanf("%d", &n);
      |     ^~~~~~~~~~~~~~~
islands.c:63:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |         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...