Submission #719264

#TimeUsernameProblemLanguageResultExecution timeMemory
719264rainboyGiraffes (JOI22_giraffes)C11
100 / 100
6496 ms1208 KiB
#include <stdio.h> #include <string.h> #define N 8000 #define M (N * 4) #define INF 0x3f3f3f3f int min(int a, int b) { return a < b ? a : b; } int max(int a, int b) { return a > b ? a : b; } unsigned int X = 12345; int rand_() { return (X *= 3) >> 1; } int ll[M], rr[M], xx[M], yy[M]; int compare_y(int h1, int h2) { return yy[h2] - yy[h1]; } int compare_r(int h1, int h2) { return rr[h2] - rr[h1]; } int (*compare)(int, int); void sort(int *hh, int l, int r) { while (l < r) { int i = l, j = l, k = r, h = hh[l + rand_() % (r - l)], tmp; while (j < k) { int c = compare(hh[j], h); if (c == 0) j++; else if (c < 0) { tmp = hh[i], hh[i] = hh[j], hh[j] = tmp; i++, j++; } else { k--; tmp = hh[j], hh[j] = hh[k], hh[k] = tmp; } } sort(hh, l, i); l = k; } } int ft[N * 2 + 1]; void update(int i, int n, int x) { while (i < n) { ft[i] = min(ft[i], x); i |= i + 1; } } int query(int i) { int x = INF; while (i >= 0) { x = min(x, ft[i]); i &= i + 1, i--; } return x; } int main() { static int aa[N], ii[N], hh[M], jj[2][2][N], tt[N]; int n, m, k, h, h_, i, j, a, u, v, l, x, tmp; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d", &aa[i]), aa[i]--; ii[aa[i]] = i; } m = 0; ll[m] = 0, rr[m] = n - 1, xx[m] = 0, yy[m] = n - 1, m++; k = 0; while (1) { for (u = 0; u < 2; u++) { for (h = 0; h < m; h++) hh[h] = h; for (v = 0; v < 2; v++) { memset(jj[u][v], 0x3f, n * sizeof *jj[u][v]); compare = compare_y, sort(hh, 0, m); memset(ft, 0x3f, (n * 2 + 1) * sizeof *ft); for (a = n - 1, h = 0; a >= 0; a--) { while (h < m && yy[h_ = hh[h]] >= a) update(yy[h_] - rr[h_] + n, n * 2 + 1, ll[h_]), h++; l = query(a - ii[a] + n); if (l != INF) jj[u][v][ii[a]] = min(jj[u][v][ii[a]], l); } compare = compare_r, sort(hh, 0, m); memset(ft, 0x3f, (n * 2 + 1) * sizeof *ft); for (i = n - 1, h = 0; i >= 0; i--) { while (h < m && rr[h_ = hh[h]] >= i) update(rr[h_] - yy[h_] + n, n * 2 + 1, xx[h_]), h++; x = query(i - aa[i] + n); if (x != INF) jj[u][v][i] = min(jj[u][v][i], -aa[i] + i + x); } for (i = 0; i < n; i++) { aa[i] = n - 1 - aa[i]; ii[aa[i]] = i; } for (h = 0; h < m; h++) tmp = n - 1 - xx[h], xx[h] = n - 1 - yy[h], yy[h] = tmp; } for (a = 0; a < n; a++) { ii[a] = n - 1 - ii[a]; aa[ii[a]] = a; } for (h = 0; h < m; h++) tmp = n - 1 - ll[h], ll[h] = n - 1 - rr[h], rr[h] = tmp; } for (v = 0; v < 2; v++) { for (i = 0; i < n; i++) tt[i] = jj[1][v][n - 1 - i] == INF ? -INF : n - 1 - jj[1][v][n - 1 - i]; memcpy(jj[1][v], tt, n * sizeof *tt); } m = 0; for (i = 0; i < n; i++) { if ((j = jj[0][0][i]) <= i) ll[m] = j, rr[m] = i - 1, xx[m] = aa[i] - i + j, yy[m] = aa[i] - 1, m++; if ((j = jj[0][1][i]) <= i) ll[m] = j, rr[m] = i - 1, xx[m] = aa[i] + 1, yy[m] = aa[i] + i - j, m++; if ((j = jj[1][0][i]) >= i) ll[m] = i + 1, rr[m] = j, xx[m] = aa[i] - j + i, yy[m] = aa[i] - 1, m++; if ((j = jj[1][1][i]) >= i) ll[m] = i + 1, rr[m] = j, xx[m] = aa[i] + 1, yy[m] = aa[i] + j - i, m++; } if (m == 0) { printf("%d\n", n - k); return 0; } k++; } return 0; }

Compilation message (stderr)

giraffes.c: In function 'main':
giraffes.c:74:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |  scanf("%d", &n);
      |  ^~~~~~~~~~~~~~~
giraffes.c:76:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   76 |   scanf("%d", &aa[i]), aa[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...