Submission #768246

#TimeUsernameProblemLanguageResultExecution timeMemory
768246rainboyHard route (IZhO17_road)C11
100 / 100
372 ms54356 KiB
#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 500000 int *ej[N], eo[N], eo_[N]; void append(int i, int j) { int o = eo[i]++; if (o >= 2 && (o & o - 1) == 0) ej[i] = (int *) realloc(ej[i], o * 2 * sizeof *ej[i]); ej[i][o] = j; } long long x_, y_; int dd[N], kk[N]; void dfs(int p, int i, int r) { int o; dd[i] = 0, kk[i] = 1; for (o = eo[i]; o--; ) { int j = ej[i][o]; if (j != p) { int d, k; long long x, y; dfs(i, j, r + 1); d = dd[j] + 1, k = kk[j]; if (dd[i] > 0) { x = (long long) (dd[i] + d) * r, y = (long long) kk[i] * kk[j]; if (x_ < x) x_ = x, y_ = 0; if (x_ == x) y_ += y; } if (dd[i] < d) dd[i] = d, kk[i] = 0; if (dd[i] == d) kk[i] += k; } } } int main() { static int qu[N], qu_[N]; int n, n_, cnt, cnt_, r, h, i, j, d, d_, k, k_, k1, o; long long x, y; scanf("%d", &n); for (i = 0; i < n; i++) ej[i] = (int *) malloc(2 * sizeof *ej[i]); for (h = 0; h < n - 1; h++) { scanf("%d%d", &i, &j), i--, j--; append(i, j), append(j, i); } memcpy(eo_, eo, n * sizeof *eo); cnt = 0; for (i = 0; i < n; i++) if (eo[i] == 1) qu[cnt++] = i; n_ = n, r = 0; while (n_ >= 3) { cnt_ = 0; for (h = 0; h < cnt; h++) { i = qu[h]; for (o = eo[i]; o--; ) { j = ej[i][o]; if (--eo_[j] == 1) qu_[cnt_++] = j; } } n_ -= cnt, r++; memcpy(qu, qu_, (cnt = cnt_) * sizeof *qu_); } x_ = 0, y_ = 0; if (n_ == 1) { i = qu[0], cnt = 0; for (o = eo[i]; o--; ) { j = ej[i][o]; dfs(i, j, r + 1); d = dd[j] + 1; if (d == r) cnt++; } if (cnt == 2) { d_ = 0, k_ = 0, k1 = 0; for (o = eo[i]; o--; ) { j = ej[i][o], d = dd[j] + 1, k = kk[j]; if (d == r) k1 += kk[j]; else { if (d_ < d) d_ = d, k_ = 0; if (d_ == d) k_ += k; } } if (d_ > 0) { x = (long long) (r + d_) * r, y = (long long) k1 * k_; if (x_ < x) x_ = x, y_ = 0; if (x_ == x) y_ += y; } } else { k1 = 0, y = 0; for (o = eo[i]; o--; ) { j = ej[i][o], d = dd[j] + 1, k = kk[j]; if (d == r) k1 += kk[j], y -= (long long) kk[j] * kk[j]; } y += (long long) k1 * k1, y /= 2; x = (long long) (r + r) * r; if (x_ < x) x_ = x, y_ = 0; if (x_ == x) y_ += y; } } else { i = qu[0], j = qu[1]; dfs(i, j, r + 1), dfs(j, i, r + 1); } if (x_ == 0) y_ = 1; printf("%lld %lld\n", x_, y_); return 0; }

Compilation message (stderr)

road.c: In function 'append':
road.c:12:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   12 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
road.c: In function 'main':
road.c:54:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |  scanf("%d", &n);
      |  ^~~~~~~~~~~~~~~
road.c:58:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |   scanf("%d%d", &i, &j), i--, j--;
      |   ^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...