This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <stdio.h>
#include <stdlib.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) {
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 = 1; j <= n_; ++j) {
if (dep[j] + s > k)
continue;
int left = k - s - dep[j];
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:37:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
37 | scanf("%d%d%d%d", &n, &m, &k, &s);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fil.c:44:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
44 | scanf("%d%d", &p, &l);
| ^~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |