제출 #967592

#제출 시각아이디문제언어결과실행 시간메모리
967592vjudge1Regions (IOI09_regions)C11
100 / 100
3655 ms68036 KiB
#pragma GCC optimize("O3,unroll-loops") #include <stdio.h> #include <assert.h> #include <stdlib.h> #define N 300000 #define R 35000 #define B 450 int *eh[R], eo[R]; void push(int i, int j) { int o=eo[i]++; if(!o)eh[i]=(int*)realloc(eh[i],sizeof**eh*2); else if(!(o&o-1)) eh[i]=(int*)realloc(eh[i],2*sizeof**eh*o); eh[i][o]=j; } int n, r, q, color[N], i, ii, j, jj, pp[N], r1, r2, tin[N], tout[N], aux[N]; int frequency[R], heavy_id[R], heavy_col[B], iota; int head[N], nxt[N], vv[N]; int on_heavy[R][B], answer; void link(int u, int v) { static int i = 1; assert(i < N); nxt[i] = head[u]; vv[i] = v; head[u] = i++; } void dfs(int u) { static int timer = 0, frequency_[R] = { 0 }; aux[tin[u] = timer++] = u; ++frequency_[color[u]]; for (int j = 0; j < iota; ++j) if (heavy_col[j] != color[u]) on_heavy[color[u]][j] += frequency_[heavy_col[j]]; for (int j = head[u]; j; j = nxt[j]) if (vv[j] != pp[u]) dfs(vv[j]); --frequency_[color[u]]; tout[u] = timer - 1; } int main() { scanf("%d%d%d", &n, &r, &q); scanf("%d", color); ++frequency[--color[0]]; for (i = 1; i < n; ++i) { scanf("%d%d", pp + i, color + i); link(--pp[i], i); if (++frequency[--color[i]] == B) heavy_col[heavy_id[color[i]] = iota++] = color[i]; } dfs(0); for (i = 0; i < n; ++i) push(color[aux[i]], aux[i]); for ( ; q--; ) { scanf("%d%d", &r1, &r2); --r1, --r2; if (frequency[r1] >= B) printf("%d\n", on_heavy[r2][heavy_id[r1]]); else { answer = 0; for (ii = 0; ii < eo[r1]; ++ii) { int in = tin[eh[r1][ii]], out = tout[eh[r1][ii]], lower, upper; /* binary search to count how many nodes with region r2 is in the subtree */ lower = -1, upper = eo[r2]; while (upper - lower > 1) { int mid = lower + (upper - lower) / 2; if (tin[eh[r2][mid]] > out) upper = mid; else lower = mid; } answer += upper; lower = -1, upper = eo[r2]; while (upper - lower > 1) { int mid = lower + (upper - lower) / 2; if (tin[eh[r2][mid]] >= in) upper = mid; else lower = mid; } answer -= upper; } printf("%d\n",answer); } fflush(stdout); } }

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

regions.c: In function 'push':
regions.c:17:18: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   17 |     else if(!(o&o-1)) eh[i]=(int*)realloc(eh[i],2*sizeof**eh*o);
      |                 ~^~
regions.c: In function 'main':
regions.c:56:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |     scanf("%d%d%d", &n, &r, &q);
      |     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.c:58:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |     scanf("%d", color);
      |     ^~~~~~~~~~~~~~~~~~
regions.c:63:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |         scanf("%d%d", pp + i, color + i);
      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.c:76:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |         scanf("%d%d", &r1, &r2);
      |         ^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...