Submission #381244

#TimeUsernameProblemLanguageResultExecution timeMemory
381244rainboyNew Home (APIO18_new_home)C11
47 / 100
5091 ms246948 KiB
#include <stdio.h> #include <stdlib.h> #define N 300000 #define Q 300000 #define N_ (1 << 19) /* N_ = pow2(ceil(log2(Q))) */ #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 xx[N], gg[N], n; int yy[Q], yy_[Q], tt_[Q], tt1[Q], q_; int compareh_y(int h1, int h2) { return yy[h1] - yy[h2]; } int compareh_t(int h1, int h2) { return tt_[h1] - tt_[h2]; } int compare_i(int i, int j) { return gg[i] != gg[j] ? gg[i] - gg[j] : xx[i] - xx[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 idx(int *xx, int x) { int lower = -1, upper = q_; while (upper - lower > 1) { int h = (lower + upper) / 2; if (xx[h] <= x) lower = h; else upper = h; } return lower; } int *stmn[N_ * 2], *stmx[N_ * 2], eo[N_ * 2], eo1[N_ * 2], *ei[N_ * 2], eo_[N_ * 2], n_; void push(int i, int x) { int o = eo[i]++; if (o == eo1[i]) { eo1[i] *= 2; stmn[i] = (int *) realloc(stmn[i], eo1[i] * sizeof *stmn[i]); stmx[i] = (int *) realloc(stmx[i], eo1[i] * sizeof *stmx[i]); } stmn[i][o] = min(o == 0 ? INF : stmn[i][o - 1], x); stmx[i][o] = max(o == 0 ? -INF : stmx[i][o - 1], x); } void pop(int i) { eo[i]--; } int getmin(int i) { return eo[i] == 0 ? INF : stmn[i][eo[i] - 1]; } int getmax(int i) { return eo[i] == 0 ? -INF : stmx[i][eo[i] - 1]; } void build() { int i; n_ = 1; while (n_ < q_) n_ <<= 1; for (i = 1; i < n_ * 2; i++) { eo1[i] = 2; stmn[i] = (int *) malloc(eo1[i] * sizeof *stmn[i]); stmx[i] = (int *) malloc(eo1[i] * sizeof *stmx[i]); } for (i = 1; i < n_ * 2; i++) ei[i] = (int *) malloc(2 * sizeof *ei[i]); } void update(int l, int r, int x) { for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) push(l++, x); if ((r & 1) == 0) push(r--, x); } } void undo(int l, int r) { for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) pop(l++); if ((r & 1) == 0) pop(r--); } } int query(int i) { int y, l, r; l = r = y = yy_[i]; for (i += n_; i > 0; i >>= 1) l = min(l, getmin(i)), r = max(r, getmax(i)); return l == -INF || r == INF ? -1 : max(y - l, r - y); } int mid(int a, int b) { return a + b > 0 ? (a + b) / 2 : -(-a + b + 1) / 2; } int pp[N], qq[N]; void remove_(int i) { int p = pp[i], q = qq[i]; if (p != -1) qq[p] = q; if (q != -1) pp[q] = p; if (p == -1 && q == -1) update(0, q_ - 1, INF), update(0, q_ - 1, -INF); else if (p == -1) update(0, idx(yy_, xx[q]), xx[q]); else if (q == -1) update(idx(yy_, xx[p] - 1) + 1, q_ - 1, xx[p]); else { int l = idx(yy_, xx[p] - 1) + 1, h = idx(yy_, mid(xx[p], xx[q])), r = idx(yy_, xx[q]); update(l, h, xx[p]), update(h + 1, r, xx[q]); } } void add(int i) { int p = pp[i], q = qq[i]; if (p != -1) qq[p] = i; if (q != -1) pp[q] = i; if (p == -1 && q == -1) undo(0, q_ - 1), undo(0, q_ - 1); else if (p == -1) undo(0, idx(yy_, xx[q])); else if (q == -1) undo(idx(yy_, xx[p] - 1) + 1, q_ - 1); else { int l = idx(yy_, xx[p] - 1) + 1, h = idx(yy_, mid(xx[p], xx[q])), r = idx(yy_, xx[q]); undo(l, h), undo(h + 1, r); } } void append_(int i, int i_) { int o = eo_[i]++; if (o >= 2 && (o & o - 1) == 0) ei[i] = (int *) realloc(ei[i], o * 2 * sizeof *ei[i]); ei[i][o] = i_; } void update_(int l, int r, int i_) { for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) append_(l++, i_); if ((r & 1) == 0) append_(r--, i_); } } int hh[Q], inv[Q], ans[Q]; void solve(int i) { int o; for (o = eo_[i]; o--; ) { int i_ = ei[i][o]; remove_(i_); } if (i >= n_) { int h = i - n_; if (h < q_) ans[hh[h]] = query(inv[hh[h]]); } else solve(i << 1 | 0), solve(i << 1 | 1); for (o = 0; o < eo_[i]; o++) { int i_ = ei[i][o]; add(i_); } } int main() { static int tt[N * 2], ii[N], ll[N], rr[N]; static char used[N]; int k, g, h, i; scanf("%d%d%d", &n, &k, &q_); for (i = 0; i < n; i++) { scanf("%d%d%d%d", &xx[i], &gg[i], &tt[i << 1 | 0], &tt[i << 1 | 1]), gg[i]--; used[gg[i]] = 1; } for (g = 0; g < k; g++) if (!used[g]) { for (h = 0; h < q_; h++) printf("-1\n"); return 0; } for (h = 0; h < q_; h++) scanf("%d%d", &yy[h], &tt_[h]); for (h = 0; h < q_; h++) hh[h] = h; compare = compareh_y, sort(hh, 0, q_); for (h = 0; h < q_; h++) yy_[h] = yy[hh[h]], inv[hh[h]] = h; for (i = 0; i < n; i++) ii[i] = i; compare = compare_i, sort(ii, 0, n); pp[ii[0]] = -1, qq[ii[n - 1]] = -1; ll[0] = 0, rr[n - 1] = q_ - 1; for (h = 0; h + 1 < n; h++) if (gg[ii[h]] == gg[ii[h + 1]]) { int h_ = idx(yy_, mid(xx[ii[h]], xx[ii[h + 1]])); qq[ii[h]] = ii[h + 1], pp[ii[h + 1]] = ii[h]; rr[h] = h_, ll[h + 1] = h_ + 1; } else { qq[ii[h]] = -1, pp[ii[h + 1]] = -1; rr[h] = q_ - 1, ll[h + 1] = 0; } build(); for (h = 0; h < n; h++) if (ll[h] <= rr[h]) update(ll[h], rr[h], xx[ii[h]]); compare = compareh_t, sort(hh, 0, q_); for (h = 0; h < q_; h++) tt1[h] = tt_[hh[h]]; for (i = 0; i < n; i++) update_(0, idx(tt1, tt[i << 1 | 0] - 1), i), update_(idx(tt1, tt[i << 1 | 1]) + 1, n_ - 1, i); solve(1); for (h = 0; h < q_; h++) printf("%d\n", ans[h]); return 0; }

Compilation message (stderr)

new_home.c: In function 'append_':
new_home.c:188:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
  188 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
new_home.c: In function 'main':
new_home.c:231:2: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  231 |  scanf("%d%d%d", &n, &k, &q_);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.c:233:3: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  233 |   scanf("%d%d%d%d", &xx[i], &gg[i], &tt[i << 1 | 0], &tt[i << 1 | 1]), gg[i]--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.c:243:3: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  243 |   scanf("%d%d", &yy[h], &tt_[h]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...