Submission #441919

#TimeUsernameProblemLanguageResultExecution timeMemory
441919rainboyPyramid Base (IOI08_pyramid_base)C11
75 / 100
5054 ms38464 KiB
#include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define N_ (1 << 20) /* N_ = pow2(ceil(log2(M))) */ #define M 1000000 #define P 400000 int min(int a, int b) { return a < b ? a : b; } int max(int a, int b) { return a > b ? a : b; } int xmin[P], xmax[P], ymin[P], ymax[P], imin[P], imax[P], cc[P], m, n, p, a, b; int iay[P * 2][3]; int compare_ymin(const void *a, const void *b) { int i = *(int *) a; int j = *(int *) b; return ymin[i] - ymin[j]; } int compare_ymax(const void *a, const void *b) { int i = *(int *) a; int j = *(int *) b; return ymax[i] - ymax[j]; } int st[N_ * 2], lz[N_ * 2]; void update(int l, int r, int x) { int l_ = l += N_, r_ = r += N_; if (l > r) return; for ( ; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) st[l] += x, lz[l] += x, l++; if ((r & 1) == 0) st[r] += x, lz[r] += x, r--; } while (l_ > 1) l_ >>= 1, st[l_] = min(st[l_ << 1 | 0], st[l_ << 1 | 1]) + lz[l_]; while (r_ > 1) r_ >>= 1, st[r_] = min(st[r_ << 1 | 0], st[r_ << 1 | 1]) + lz[r_]; } void merge() { int h, i, j; for (i = j = 0; (h = i + j) < p + p; ) { int *zz = iay[h]; if (j == p) zz[1] = 1, zz[2] = ymin[zz[0] = imin[i++]] - a + 1; else if (i == p) zz[1] = 0, zz[2] = ymax[zz[0] = imax[j++]] + 1; else { int y1 = ymin[imin[i]] - a + 1, y0 = ymax[imax[j]] + 1; if (y1 < y0) zz[0] = imin[i++], zz[1] = 1, zz[2] = y1; else zz[0] = imax[j++], zz[1] = 0, zz[2] = y0; } } } int check() { int h, j, zero; memset(st, 0, N_ * 2 * sizeof *st), memset(lz, 0, N_ * 2 * sizeof *lz); update(m - a + 1, N_ - 1, b + 1); merge(); zero = 0; for (h = 0; h < p * 2; h = j) { int y = iay[h][2]; if (y + a - 1 >= n) /* top boundary */ break; if (!zero && y > 0) { zero = 1; if (st[1] <= b) return 1; } for (j = h; j < p * 2 && iay[j][2] == y; j++) { int i_ = iay[j][0]; update(max(xmin[i_] - a + 1, 0), min(xmax[i_], m - a), iay[j][1] ? cc[i_] : -cc[i_]); } if (y < 0) /* bottom boundary */ continue; if (st[1] <= b) return 1; } return 0; } int main() { int i, lower, upper; scanf("%d%d%d%d", &m, &n, &b, &p); for (i = 0; i < p; i++) { int x1, y1, x2, y2, c; scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c), x1--, x2--, y1--, y2--; xmin[i] = x1, xmax[i] = x2, ymin[i] = y1, ymax[i] = y2, cc[i] = c; imin[i] = imax[i] = i; } qsort(imin, p, sizeof *imin, compare_ymin); qsort(imax, p, sizeof *imax, compare_ymax); if (check()) { lower = 1, upper = (m < n ? m : n) + 1; while (upper - lower > 1) { a = (lower + upper) / 2; if (check()) lower = a; else upper = a; } } else lower = 0; printf("%d\n", lower); return 0; }

Compilation message (stderr)

pyramid_base.c: In function 'main':
pyramid_base.c:104:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  104 |  scanf("%d%d%d%d", &m, &n, &b, &p);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.c:108:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  108 |   scanf("%d%d%d%d%d", &x1, &y1, &x2, &y2, &c), x1--, x2--, y1--, y2--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...