제출 #434075

#제출 시각아이디문제언어결과실행 시간메모리
434075rainboyRegions (IOI09_regions)C11
100 / 100
2923 ms17180 KiB
#include <stdio.h> #include <stdlib.h> #define N 200000 #define R 25000 #define K 450 #define S 450 int ta[N], tb[N]; int main() { static int pp[N], rr[N], qu[N], uu[N], dd[N], *iii[R], kk[R], ss[R], uuu[S][R], ddd[S][R]; int n, r_, q, r, s, i, j; scanf("%d%d%d", &n, &r_, &q); for (i = 0; i < n; i++) { if (i > 0) scanf("%d", &pp[i]), pp[i]--; scanf("%d", &rr[i]), rr[i]--; kk[rr[i]]++; } for (i = n - 1; i >= 0; i--) { tb[i]++; if (i > 0) tb[pp[i]] += tb[i]; } for (i = 0; i < n; i++) { if (i == 0) ta[i] = 0, tb[i] = 1; else ta[i] = tb[pp[i]], tb[pp[i]] += tb[i]; qu[ta[i]] = i; tb[i] = ta[i] + 1; } for (r = 0, s = 0; r < r_; r++) if (kk[r] >= K) { ss[r] = s; for (i = 0; i < n; i++) { uu[i] = (i == 0 ? 0 : uu[pp[i]]) + (rr[i] == r); dd[i] = rr[i] == r; } for (i = n - 1; i > 0; i--) dd[pp[i]] += dd[i]; for (i = 0; i < n; i++) uuu[s][rr[i]] += uu[i], ddd[s][rr[i]] += dd[i]; s++; } for (r = 0; r < r_; r++) iii[r] = (int *) malloc(kk[r] * sizeof *iii[r]), kk[r] = 0; for (i = 0; i < n; i++) { r = rr[qu[i]]; iii[r][kk[r]++] = qu[i]; } while (q--) { int r1, r2; scanf("%d%d", &r1, &r2), r1--, r2--; if (kk[r1] >= K) printf("%d\n", uuu[ss[r1]][r2]), fflush(stdout); else if (kk[r2] >= K) printf("%d\n", ddd[ss[r2]][r1]), fflush(stdout); else { int h1, h2, ans, cnt; ans = 0, cnt = 0; for (h1 = 0, h2 = 0; h2 < kk[r2]; h2++) { j = iii[r2][h2]; while (cnt && tb[qu[cnt - 1]] <= ta[j]) cnt--; while (h1 < kk[r1] && ta[i = iii[r1][h1]] <= ta[j]) { if (ta[j] < tb[i]) qu[cnt++] = i; h1++; } ans += cnt; } printf("%d\n", ans), fflush(stdout); } } return 0; }

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

regions.c: In function 'main':
regions.c:15:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |  scanf("%d%d%d", &n, &r_, &q);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.c:18:4: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |    scanf("%d", &pp[i]), pp[i]--;
      |    ^~~~~~~~~~~~~~~~~~~
regions.c:19:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   19 |   scanf("%d", &rr[i]), rr[i]--;
      |   ^~~~~~~~~~~~~~~~~~~
regions.c:57:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |   scanf("%d%d", &r1, &r2), r1--, r2--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...