Submission #544721

#TimeUsernameProblemLanguageResultExecution timeMemory
544721rainboyFile Paths (BOI15_fil)C11
100 / 100
105 ms5588 KiB
#include <stdio.h> #include <stdlib.h> #define N 3000 #define M 3000 #define L 1000000 int *ej[N + 1], eo[N + 1], *eh[N + 1], eo_[N + 1]; void link(int **ex, int *eo, int i, int x) { int o = eo[i]++; if (o >= 2 && (o & o - 1) == 0) ex[i] = (int *) realloc(ex[i], o * 2 * sizeof *ex[i]); ex[i][o] = x; } int dd[N + 1], pp[N + 1], ll[M]; char ans[M]; char used[L + 1]; int kk[L + 1], l_, l1; void dfs_(int r, int i, int sign) { int o; if (dd[i] - dd[r] + l1 <= l_) kk[dd[i] - dd[r] + l1] += sign; for (o = 0; o < eo[i]; o++) { int j = ej[i][o]; dfs_(r, j, sign); } } void dfs(int i) { int o, p; dfs_(i, i, 1); for (o = 0; o < eo_[i]; o++) { int h = eh[i][o], a, b; if (dd[i] == l_ - ll[h]) { ans[h] = 1; continue; } for (p = i; p != -1 && dd[i] - dd[p] <= l_ - ll[h]; p = pp[p]) { b = l_ - ll[h] - (dd[i] - dd[p]); if (l1 <= b && used[b - l1]) { ans[h] = 1; break; } } if (ans[h]) continue; b = l_ - ll[h] - dd[i]; if (b > 0) for (a = 1; a <= b / a; a++) if (b % a == 0 && (kk[a] > 0 || kk[b / a] > 0)) { ans[h] = 1; break; } } for (o = 0; o < eo[i]; o++) { int j = ej[i][o]; dfs(j); } dfs_(i, i, -1); } int main() { int n, m, h, i; scanf("%d%d%d%d", &n, &m, &l_, &l1), l1++; for (i = 0; i <= n; i++) { ej[i] = (int *) malloc(2 * sizeof *ej[i]); eh[i] = (int *) malloc(2 * sizeof *eh[i]); } pp[0] = -1; for (i = 1; i <= n; i++) { scanf("%d%d", &pp[i], &dd[i]), dd[i] += dd[pp[i]] + 1; link(ej, eo, pp[i], i); } for (i = 0; i <= n; i++) if (dd[i] <= l_) used[dd[i]] = 1; for (h = 0; h < m; h++) { scanf("%d%d", &i, &ll[h]), ll[h]++; link(eh, eo_, i, h); } dfs(0); for (h = 0; h < m; h++) printf(ans[h] ? "YES\n" : "NO\n"); return 0; }

Compilation message (stderr)

fil.c: In function 'link':
fil.c:13:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   13 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
fil.c: In function 'main':
fil.c:72:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   72 |  scanf("%d%d%d%d", &n, &m, &l_, &l1), l1++;
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fil.c:79:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |   scanf("%d%d", &pp[i], &dd[i]), dd[i] += dd[pp[i]] + 1;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fil.c:86:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |   scanf("%d%d", &i, &ll[h]), ll[h]++;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...