Submission #430260

#TimeUsernameProblemLanguageResultExecution timeMemory
430260rainboyToy Train (IOI17_train)C++98
11 / 100
25 ms1612 KiB
#include "train.h" #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; const int N = 5000, SMALL = 15, M = 20000; typedef vector<int> vi; int *ej[N], eo[N], *fi[N], fo[N]; void append(int **ej, int *eo, int i, int j) { int o = eo[i]++; if (o >= 2 && (o & o - 1) == 0) ej[i] = (int *) realloc(ej[i], o * 2 * sizeof *ej[i]); ej[i][o] = j; } int cc[N], qu[N], cnt; void dfs1(int i) { int o; if (cc[i]) return; cc[i] = -1; for (o = eo[i]; o--; ) { int j = ej[i][o]; dfs1(j); } qu[cnt++] = i; } vi rr; char has_[N]; int k, has; void dfs2(int j, int c) { int o; if (cc[j] != -1) { if (cc[j] != c && has_[cc[j]]) has_[c] = 1; return; } if (rr[j]) has = 1; cc[j] = c, k++; for (o = fo[j]; o--; ) { int i = fi[j][o]; dfs2(i, c); } } char self[N], right[N]; vi who_wins(vi aa, vi rr_, vi uu, vi vv) { int n = aa.size(), m = uu.size(), h, i, j, ka, kb; vi ans(n); rr = rr_; ka = kb = 0; for (i = 0; i < n; i++) if (aa[i] == 1) ka++; else kb++; if (ka == n) { for (i = 0; i < n; i++) { ej[i] = (int *) malloc(2 * sizeof *ej[i]); fi[i] = (int *) malloc(2 * sizeof *fi[i]); } for (h = 0; h < m; h++) { i = vv[h], j = uu[h]; if (i == j) self[i] = 1; append(ej, eo, i, j), append(fi, fo, j, i); } for (i = 0; i < n; i++) if (!cc[i]) dfs1(i); while (cnt--) { i = qu[cnt]; if (cc[i] != -1) continue; k = 0, has = 0, dfs2(i, i); if ((k >= 2 || self[i]) && has) has_[i] = 1; } for (i = 0; i < n; i++) ans[i] = has_[cc[i]]; } else if (kb == n) { for (i = 0; i < n; i++) { ej[i] = (int *) malloc(2 * sizeof *ej[i]); fi[i] = (int *) malloc(2 * sizeof *fi[i]); } for (h = 0; h < m; h++) { i = vv[h], j = uu[h]; if (i == j) self[i] = 1; if (!rr[i] && !rr[j]) append(ej, eo, i, j), append(fi, fo, j, i); } for (i = 0; i < n; i++) if (!cc[i]) dfs1(i); while (cnt--) { i = qu[cnt]; if (cc[i] != -1) continue; k = 0, has = 0, dfs2(i, i); if (k >= 2 || self[i]) has_[i] = 1; } for (h = 0; h < m; h++) { i = vv[h], j = uu[h]; if (rr[i] || rr[j]) append(ej, eo, i, j), append(fi, fo, j, i); } memset(cc, 0, n * sizeof *cc); for (i = 0; i < n; i++) if (has_[i]) dfs1(i); for (i = 0; i < n; i++) ans[i] = cc[i] == 0; } else { memset(self, 0, n * sizeof *self), memset(right, 0, n * sizeof *right); for (h = 0; h < m; h++) if (vv[h] == uu[h]) self[uu[h]] = 1; else right[uu[h]] = 1; for (i = 0; i < n; i++) { ans[i] = 0; for (j = i; j < n; j++) if (aa[j]) { if (rr[j]) { if (self[j]) { ans[i] = 1; break; } } else { if (!right[j]) { ans[i] = 0; break; } } } else { if (rr[j]) { if (!right[j]) { ans[i] = 1; break; } } else { if (self[j]) { ans[i] = 0; break; } } } } } return ans; }

Compilation message (stderr)

train.cpp: In function 'void append(int**, int*, int, int)':
train.cpp:17:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   17 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
#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...