Submission #1039879

#TimeUsernameProblemLanguageResultExecution timeMemory
1039879sleepntsheepInside information (BOI21_servers)C11
0 / 100
3568 ms9320 KiB
#include <stdio.h> #include <stdlib.h> #define N 120001 int n, q, pp[N], jj[N], dd[N], up[N], temp, inc[N]; int *eh[N], *fh[N], eo[N]; void pus_(int **eh, int *eo, int i, int j) { int o = eo[i]++; if (0 == o) eh[i] = (int*)malloc(2 * sizeof **eh); else if (0 == (o & o - 1)) eh[i] = (int*)realloc(eh[i], 2 * o * sizeof **eh); eh[i][o] = j; } void link(int u, int v, int w) { pus_(eh, eo, u, v); --eo[u]; pus_(fh, eo, u, v); pus_(eh, eo, v, u); --eo[v]; pus_(fh, eo, v, u); } void dfs(int u, int p) { dd[u] = dd[pp[u] = p] + 1; inc[u] = (up[u] > up[p]) + inc[p]; for (int j = 0; j < eo[u]; ++j) if (eh[u][j] != p) { up[eh[u][j]] = fh[u][j]; dfs(eh[u][j], u); } } int lca(int u, int v) { while (dd[u] != dd[v]) { if (dd[u] < dd[v]) temp = u, u = v, v = temp; u = (dd[jj[u]] >= dd[v]) ? jj[u] : pp[u]; } while (u != v) if (jj[u] != jj[v]) u = jj[u], v = jj[v]; else u = pp[u], v = pp[v]; return u; } int anc(int u, int dep) { while (dd[u] > dep) if (dd[jj[u]] >= dep) u = jj[u]; else u = pp[u]; return u; } struct Query { char type; int a, b; int ans; } qq[N]; /* v = data node, u = ask node */ int query_yesno(int u, int v) { if (u == v) return 1; int a = lca(u, v); int va = anc(v, dd[a] + 1); int ua = anc(u, dd[a] + 1); if (u == a) return inc[v] - inc[va] == dd[u] - dd[a] - 1; if (v == a) return inc[u] - inc[ua] == 0; return (dd[u] - dd[a] + 1 == inc[v] - inc[va]) && (0 == inc[u] - inc[ua]) && up[va] < up[ua]; } int main() { scanf("%d%d", &n, &q); q = n + q - 1; for (int j = 0, i = 0; i < q; ++i) { char c; int a, b; scanf(" %c%d", &c, &a); if (c == 'S') { scanf("%d", &b); link(a, b, j++); } else if (c == 'Q') { scanf("%d", &b); } else { } qq[i] = (struct Query){c, a, b}; } jj[1] = 1; dfs(1, 1); for (int i = 0; i < q; ++i) { if (qq[i].type == 'Q') { puts(query_yesno(qq[i].a, qq[i].b) ? "YES": "NO"); } } }

Compilation message (stderr)

servers.c: In function 'pus_':
servers.c:13:26: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   13 |     else if (0 == (o & o - 1)) eh[i] = (int*)realloc(eh[i], 2 * o * sizeof **eh);
      |                        ~~^~~
servers.c: In function 'main':
servers.c:77:5: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |     scanf("%d%d", &n, &q);
      |     ^~~~~~~~~~~~~~~~~~~~~
servers.c:83:9: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |         scanf(" %c%d", &c, &a);
      |         ^~~~~~~~~~~~~~~~~~~~~~
servers.c:85:13: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   85 |             scanf("%d", &b);
      |             ^~~~~~~~~~~~~~~
servers.c:88:13: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   88 |             scanf("%d", &b);
      |             ^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...