Submission #719425

#TimeUsernameProblemLanguageResultExecution timeMemory
719425rainboyCircus (Balkan15_CIRCUS)C++17
100 / 100
1129 ms23536 KiB
#include "circus.h" #include <string.h> const int N = 100001; const int 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 xx[N], xx1[N], xx2[N], yy[N], ii[N], ii1[N], ii2[N], n; int compare_x(int i, int j) { return xx[i] - xx[j]; } int compare_xpy(int i, int j) { return (xx[i] + yy[i]) - (xx[j] + yy[j]); } int compare_xmy(int i, int j) { return (xx[i] - yy[i]) - (xx[j] - yy[j]); } int (*compare)(int, int); void sort(int *ii, int l, int r) { while (l < r) { int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp; while (j < k) { int c = compare(ii[j], i_); if (c == 0) j++; else if (c < 0) { tmp = ii[i], ii[i] = ii[j], ii[j] = tmp; i++, j++; } else { k--; tmp = ii[j], ii[j] = ii[k], ii[k] = tmp; } } sort(ii, l, i); l = k; } } int dd[N * 2], iq[N * 2 + 1], pq[N * 2], cnt; int lt(int i, int j) { return dd[i] < dd[j]; } int p2(int p) { return (p *= 2) > cnt ? 0 : (p < cnt && lt(iq[p + 1], iq[p]) ? p + 1 : p); } void pq_up(int i) { int p, q, j; for (p = pq[i]; (q = p / 2) && lt(i, j = iq[q]); p = q) iq[pq[j] = p] = j; iq[pq[i] = p] = i; } void pq_dn(int i) { int p, q, j; for (p = pq[i]; (q = p2(p)) && lt(j = iq[q], i); p = q) iq[pq[j] = p] = j; iq[pq[i] = p] = i; } void pq_add_last(int i) { iq[pq[i] = ++cnt] = i; } int pq_remove_first() { int i = iq[1], j = iq[cnt--]; if (j != i) pq[j] = 1, pq_dn(j); pq[i] = 0; return i; } void init(int n_, int m, int *xx_) { n = n_; for (int i = 0; i < n; i++) xx[i] = xx_[i]; xx[n++] = m; for (int i = 0; i < n; i++) ii[i] = i; compare = compare_x, sort(ii, 0, n); memset(dd, 0x3f, n * 2 * sizeof *dd); dd[n - 1 << 1 | 0] = 0, pq_add_last(n - 1 << 1 | 0); while (cnt) { int u, v, i, t, d; u = pq_remove_first(), i = u >> 1, t = (u & 1); if (t == 0) { if (i > 0) { v = i - 1 << 1 | 0, d = dd[u] + xx[ii[i]] - xx[ii[i - 1]]; if (dd[v] > d) { if (dd[v] == INF) pq_add_last(v); dd[v] = d, pq_up(v); } } } else { if (i + 1 < n) { v = i + 1 << 1 | 1, d = dd[u] + xx[ii[i + 1]] - xx[ii[i]]; if (dd[v] > d) { if (dd[v] == INF) pq_add_last(v); dd[v] = d, pq_up(v); } } } int lower, upper, j; lower = i - 1, upper = n; while (upper - lower > 1) { j = (lower + upper) / 2; if (xx[ii[j]] - xx[ii[i]] >= dd[u]) upper = j; else lower = j; } j = upper; if (j < n) { v = j << 1 | 1, d = xx[ii[j]] - xx[ii[i]]; if (dd[v] > d) { if (dd[v] == INF) pq_add_last(v); dd[v] = d, pq_up(v); } } lower = -1, upper = i + 1; while (upper - lower > 1) { j = (lower + upper) / 2; if (xx[ii[i]] - xx[ii[j]] >= dd[u]) lower = j; else upper = j; } j = lower; if (j >= 0) { v = j << 1 | 0, d = xx[ii[i]] - xx[ii[j]]; if (dd[v] > d) { if (dd[v] == INF) pq_add_last(v); dd[v] = d, pq_up(v); } } } for (int i = 0; i < n; i++) yy[ii[i]] = min(dd[i << 1 | 0], dd[i << 1 | 1]); for (int i = 0; i < n; i++) ii1[i] = i; compare = compare_xpy, sort(ii1, 0, n); for (int i = 0; i < n; i++) xx1[i] = max(i == 0 ? -INF : xx1[i - 1], xx[ii1[i]]); for (int i = 0; i < n; i++) ii2[i] = i; compare = compare_xmy, sort(ii2, 0, n); for (int i = n - 1; i >= 0; i--) xx2[i] = min(i + 1 == n ? INF : xx2[i + 1], xx[ii2[i]]); } int minLength(int x) { int lower, upper, i, ans; ans = INF; lower = -1, upper = n; while (upper - lower > 1) { i = (lower + upper) / 2; if (xx[ii1[i]] + yy[ii1[i]] <= x) lower = i; else upper = i; } i = lower; if (i >= 0) ans = min(ans, x - xx1[i]); lower = -1, upper = n; while (upper - lower > 1) { i = (lower + upper) / 2; if (xx[ii2[i]] - yy[ii2[i]] >= x) upper = i; else lower = i; } i = upper; if (i < n) ans = min(ans, xx2[i] - x); return ans; }

Compilation message (stderr)

circus.cpp: In function 'void init(int, int, int*)':
circus.cpp:95:7: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   95 |  dd[n - 1 << 1 | 0] = 0, pq_add_last(n - 1 << 1 | 0);
      |     ~~^~~
circus.cpp:95:40: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
   95 |  dd[n - 1 << 1 | 0] = 0, pq_add_last(n - 1 << 1 | 0);
      |                                      ~~^~~
circus.cpp:101:11: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
  101 |     v = i - 1 << 1 | 0, d = dd[u] + xx[ii[i]] - xx[ii[i - 1]];
      |         ~~^~~
circus.cpp:110:11: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
  110 |     v = i + 1 << 1 | 1, d = dd[u] + xx[ii[i + 1]] - xx[ii[i]];
      |         ~~^~~
grader.cpp: In function 'int main()':
grader.cpp:14:12: warning: unused variable 'max_code' [-Wunused-variable]
   14 |  long long max_code;
      |            ^~~~~~~~
grader.cpp:16:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |  scanf("%d%d", &N, &M);
      |  ~~~~~^~~~~~~~~~~~~~~~
grader.cpp:18:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |   scanf("%d", &P[i]);
      |   ~~~~~^~~~~~~~~~~~~
grader.cpp:21:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |  scanf("%d", &Q);
      |  ~~~~~^~~~~~~~~~
grader.cpp:23:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   23 |   scanf("%d", &d);
      |   ~~~~~^~~~~~~~~~
#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...