제출 #545427

#제출 시각아이디문제언어결과실행 시간메모리
545427rainboy공장들 (JOI14_factories)C11
100 / 100
3457 ms228772 KiB
#include "factories.h" #include <stdlib.h> #include <string.h> #define N 500000 #define LN 18 /* LN = floor(log2(N)) */ #define INF 0x3f3f3f3f3f3f3f3fLL long long min(long long a, long long b) { return a < b ? a : b; } int *ej[N], *ew[N], eo[N], n; void append(int i, int j, int w) { int o = eo[i]++; if (o >= 2 && (o & o - 1) == 0) { ej[i] = (int *) realloc(ej[i], o * 2 * sizeof *ej[i]); ew[i] = (int *) realloc(ew[i], o * 2 * sizeof *ew[i]); } ej[i][o] = j, ew[i][o] = w; } int sz[N], c; void dfs1(int p, int i, int n) { int o, centroid; sz[i] = 1, centroid = 1; for (o = eo[i]; o--; ) { int j = ej[i][o]; if (j != p) { dfs1(i, j, n); sz[i] += sz[j]; if (sz[j] * 2 > n) centroid = 0; } } if ((n - sz[i]) * 2 > n) centroid = 0; if (centroid) c = i; } void delete(int i, int j) { int o; for (o = eo[i]; o--; ) if (ej[i][o] == j) { eo[i]--; while (o < eo[i]) ej[i][o] = ej[i][o + 1], ew[i][o] = ew[i][o + 1], o++; return; } } int cc[N][LN + 1], kk[N]; long long dd[N][LN + 1]; void dfs2(int p, int i, long long d) { int o; cc[i][kk[i]] = c, dd[i][kk[i]] = d, kk[i]++; for (o = eo[i]; o--; ) { int j = ej[i][o], w = ew[i][o]; if (j != p) dfs2(i, j, d + w); } } void cd(int i, int n) { int o; dfs1(-1, i, n), i = c; dfs2(-1, i, 0); for (o = eo[i]; o--; ) { int j = ej[i][o]; delete(j, i); cd(j, sz[j] < sz[i] ? sz[j] : n - sz[i]); } } long long dd_[N]; void Init(int n_, int ii[], int jj[], int ww[]) { int h, i; n = n_; for (i = 0; i < n; i++) { ej[i] = (int *) malloc(2 * sizeof *ej[i]); ew[i] = (int *) malloc(2 * sizeof *ew[i]); } for (h = 0; h < n - 1; h++) { append(ii[h], jj[h], ww[h]), append(jj[h], ii[h], ww[h]); } cd(0, n); memset(dd_, 0x3f, n * sizeof *dd_); } long long Query(int n1, int ii1[], int n2, int ii2[]) { int g, h, i, c; long long ans; for (h = 0; h < n1; h++) { i = ii1[h]; for (g = 0; g < kk[i]; g++) { c = cc[i][g]; dd_[c] = min(dd_[c], dd[i][g]); } } ans = INF; for (h = 0; h < n2; h++) { i = ii2[h]; for (g = 0; g < kk[i]; g++) { c = cc[i][g]; ans = min(ans, dd_[c] + dd[i][g]); } } for (h = 0; h < n1; h++) { i = ii1[h]; for (g = 0; g < kk[i]; g++) { c = cc[i][g]; dd_[c] = INF; } } return ans; }

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

factories.c: In function 'append':
factories.c:18:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   18 |  if (o >= 2 && (o & o - 1) == 0) {
      |                     ~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...