Submission #831491

#TimeUsernameProblemLanguageResultExecution timeMemory
831491rainboyWatermelon (INOI20_watermelon)C11
100 / 100
53 ms29728 KiB
#include <stdio.h> #include <stdlib.h> #define N 100000 #define K 10 #define N_ (N * K * 2 + 1) unsigned int Z = 12345; int rand_() { return (Z *= 3) >> 1; } int n, k; int *ej[N], eo[N], dd[N]; void append(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, dd[j]++; } int zz[N_], ll[N_], rr[N_], ii[N_], u_, l_, r_; int node(int i) { static int _ = 1; zz[_] = rand_(); ii[_] = i; return _++; } void split(int u, int i) { if (u == 0) { u_ = l_ = r_ = 0; return; } if (ii[u] < i) { split(rr[u], i); rr[u] = l_, l_ = u; } else if (ii[u] > i) { split(ll[u], i); ll[u] = r_, r_ = u; } else { u_ = u, l_ = ll[u], r_ = rr[u]; ll[u] = rr[u] = 0; } } int merge(int u, int v) { if (u == 0) return v; if (v == 0) return u; if (zz[u] < zz[v]) { rr[u] = merge(rr[u], v); return u; } else { ll[v] = merge(u, ll[v]); return v; } } void tr_add(int i) { split(u_, i); u_ = merge(merge(l_, node(i)), r_); } void tr_remove(int i) { split(u_, i); u_ = merge(l_, r_); } int tr_higher(int i) { int u = u_, i_ = -1; while (u) if (ii[u] > i) i_ = ii[u], u = ll[u]; else u = rr[u]; return i_; } int aa[N]; int branch(int a) { int i, o; if (a == n) { if (--k == 0) { for (i = 0; i < n; i++) printf("%d ", aa[i] + 1); printf("\n"); return 1; } return 0; } if (u_ == 0) return 0; i = -1; while ((i = tr_higher(i)) != -1) { tr_remove(i); aa[i] = a; for (o = eo[i]; o--; ) { int j = ej[i][o]; if (--dd[j] == 0) tr_add(j); } if (branch(a + 1)) return 1; for (o = eo[i]; o--; ) { int j = ej[i][o]; if (dd[j]++ == 0) tr_remove(j); } tr_add(i); } return 0; } int main() { static int tt[N], qu[N]; int cnt, h, i; scanf("%d%d", &n, &k); for (i = 0; i < n; i++) scanf("%d", &tt[i]); if (tt[n - 1] != -1) { printf("-1\n"); return 0; } for (i = 0; i < n; i++) ej[i] = (int *) malloc(2 * sizeof *ej[i]); cnt = 0; for (i = n - 1; i >= 0; i--) if (tt[i] == -1) { while (cnt) append(qu[--cnt], i); qu[cnt++] = i; } else { h = cnt; while (h >= 2 && tt[qu[h - 1]] < tt[i]) append(qu[--h], i); if ((h == cnt ? 0 : tt[qu[h]]) != tt[i] - 1) { printf("-1\n"); return 0; } append(i, qu[h - 1]); if (h >= 2 && tt[qu[h - 1]] == tt[i]) h--; qu[h++] = i; cnt = h; } for (i = 0; i < n; i++) if (dd[i] == 0) tr_add(i); if (!branch(0)) printf("-1\n"); return 0; }

Compilation message (stderr)

Main.c: In function 'append':
Main.c:21:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   21 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
Main.c: In function 'main':
Main.c:131:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  131 |  scanf("%d%d", &n, &k);
      |  ^~~~~~~~~~~~~~~~~~~~~
Main.c:133:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  133 |   scanf("%d", &tt[i]);
      |   ^~~~~~~~~~~~~~~~~~~
#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...