#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
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--;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
23 ms |
16716 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
23 ms |
16748 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
35 ms |
16720 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
48 ms |
16764 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
58 ms |
16676 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
63 ms |
16716 KB |
Output is correct |
2 |
Incorrect |
70 ms |
16720 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
76 ms |
16716 KB |
Output is correct |
2 |
Correct |
67 ms |
16804 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
63 ms |
16972 KB |
Output is correct |
2 |
Correct |
61 ms |
17100 KB |
Output is correct |
3 |
Correct |
73 ms |
16996 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
161 ms |
17444 KB |
Output is correct |
2 |
Correct |
205 ms |
17484 KB |
Output is correct |
3 |
Correct |
198 ms |
17508 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
235 ms |
17804 KB |
Output is correct |
2 |
Correct |
122 ms |
18236 KB |
Output is correct |
3 |
Correct |
78 ms |
18252 KB |
Output is correct |
4 |
Correct |
470 ms |
18452 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
379 ms |
18092 KB |
Output is correct |
2 |
Correct |
577 ms |
18940 KB |
Output is correct |
3 |
Correct |
263 ms |
18884 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
368 ms |
18428 KB |
Output is correct |
2 |
Correct |
707 ms |
19224 KB |
Output is correct |
3 |
Correct |
700 ms |
19220 KB |
Output is correct |
4 |
Correct |
747 ms |
19236 KB |
Output is correct |
5 |
Correct |
741 ms |
19144 KB |
Output is correct |
6 |
Correct |
262 ms |
19312 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4454 ms |
27672 KB |
Output is correct |
2 |
Correct |
1662 ms |
27476 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5054 ms |
33112 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5022 ms |
38464 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |