Submission #1046303

#TimeUsernameProblemLanguageResultExecution timeMemory
1046303sleepntsheepFile Paths (BOI15_fil)C11
33 / 100
120 ms704 KiB
#include <stdio.h> #include <stdlib.h> #include<assert.h> #define N 6005 int n_, s, n, m, k, m_, par[N], *eh[N], eo[N], dep[N], chain[N], o; int cc(const void *i, const void *j) { return *(int*)i-*(int*)j; } void pus(int i, int j) { int o = eo[i]++; if (!o) eh[i] = (int*)malloc(sizeof **eh * 2); else if (0 == (o & o - 1)) eh[i] = (int*)realloc(eh[i], 2 * o * sizeof **eh); eh[i][o] = j; } void efs(int u) { assert(0); dep[u] = 1e9; for (int j = 0; j < eo[u]; j += 2) if (eh[u][j] != par[u]) efs(eh[u][j]); } void dfs(int u) { for (int j = 0; j < eo[u]; j += 2) if (eh[u][j] != par[u]) { int v = eh[u][j], l = eh[u][j+1]; dep[v] = l + dep[u]; if (dep[v] > k) efs(v); else dfs(v); } } int main(void) { scanf("%d%d%d%d", &n, &m, &k, &s); n_ = n; m_ = m; n = n + m; ++s; for (int p, l, i = 1; i <= n; ++i) { scanf("%d%d", &p, &l); pus(par[i] = p, i); pus(p, l + 1); } dfs(0); /* sub 2 */ for (int i = n_ + 1; i <= n; ++i) { if (dep[i] == k) { puts("YES"); continue; } o = 0; for (int cur = i; cur != 0; cur = par[cur]) if (cur <= n_) chain[o++] = dep[i] - dep[cur]; chain[o++] = dep[i]; qsort(chain, o, sizeof *chain, cc); for (int j = 0; j <= n_; ++j) { int left = k - s - dep[j]; if (left > 0) { int md, lb = 0, ub = o; while (ub - lb > 1) if (chain[md = lb + (ub - lb) / 2] <= left) lb = md; else ub = md; if (chain[lb] == left) { puts("YES"); goto Next; } } } puts("NO"); Next:; } }

Compilation message (stderr)

fil.c: In function 'pus':
fil.c:15:24: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   15 |   else if (0 == (o & o - 1)) eh[i] = (int*)realloc(eh[i], 2 * o * sizeof **eh);
      |                      ~~^~~
fil.c: In function 'main':
fil.c:38:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |   scanf("%d%d%d%d", &n, &m, &k, &s);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fil.c:45:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |     scanf("%d%d", &p, &l);
      |     ^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...