#include <bits/stdc++.h>
using namespace std;
#define pb push_back
typedef long long ll;
const int len = 1e6+4;
const ll inf = 1e16;
int cost[len], n, m, bud, q;
vector<int> buck[len];
struct rectangle{
int x1, x2, y1, y2;
} rec[len];
struct node{
ll mn, lazy;
node(ll mn_ = 0, ll lazy_ = 0){
mn = mn_;
lazy = lazy_;
}
} tree[4*len];
void prop(int p, int l, int r){
tree[p].mn += tree[p].lazy;
if (l != r){
tree[2*p].lazy += tree[p].lazy;
tree[2*p+1].lazy += tree[p].lazy;
}
tree[p].lazy = 0;
}
void build(int p, int l, int r){
if (l == r)
return void(tree[p] = node());
int mid = (l+r)/2;
build(2*p, l, mid);
build(2*p+1, mid+1, r);
tree[p] = node();
}
void update(int p, int l, int r, int i, int j, int v){
prop(p, l, r);
if (i <= l && r <= j)
return void(tree[p].lazy += v);
int mid = (l+r)/2;
if (i <= mid)
update(2*p, l, mid, i, j, v);
if (j >= mid+1)
update(2*p+1, mid+1, r, i, j, v);
prop(2*p, l, mid), prop(2*p+1, mid+1, r);
tree[p].mn = min(tree[2*p].mn, tree[2*p+1].mn);
}
ll query(int p, int l, int r, int i, int j){
prop(p, l, r);
if (r < i || j < l)
return inf;
if (i <= l && r <= j)
return tree[p].mn;
int mid = (l+r)/2;
return min(query(2*p, l, mid, i, j), query(2*p+1, mid+1, r, i, j));
}
bool check(int k){
for (int i = 1; i <= m+1; i++)
buck[i].clear();
for (int i = 1; i <= q; i++){
int y1 = rec[i].y1, y2 = rec[i].y2;
buck[max(1, y1-k+1)].pb(i);
buck[y2+1].pb(-i);
}
for (int i = 1; i <= 4*n; i++)
tree[i] = node();
for (int y = 1; y <= m-k+1; y++){
for (int j = 0; j < buck[y].size(); j++){
int i = abs(buck[y][j]);
int x1 = rec[i].x1, x2 = rec[i].x2;
if (buck[y][j] > 0)
update(1, 1, n, max(1, x1-k+1), x2, cost[i]);
else
update(1, 1, n, max(1, x1-k+1), x2, -cost[i]);
}
if (y != 1 && buck[y].empty())
continue;
if (query(1, 1, n, 1, n-k+1) <= 1ll*bud)
return true;
}
return false;
}
int bs(){
int l = 1, r = min(n, m), ans = 0;
while (l <= r){
int mid = (l+r)/2;
if (check(mid))
ans = mid, l = mid+1;
else
r = mid-1;
}
return ans;
}
int main(){
scanf("%d %d %d %d", &n, &m, &bud, &q);
for (int i = 1; i <= q; i++)
scanf("%d %d %d %d %d", &rec[i].x1, &rec[i].y1, &rec[i].x2, &rec[i].y2, &cost[i]);
printf("%d\n", bs());
return 0;
}
Compilation message
pyramid_base.cpp: In function 'bool check(int)':
pyramid_base.cpp:86:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
86 | for (int j = 0; j < buck[y].size(); j++){
| ~~^~~~~~~~~~~~~~~~
pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:120:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
120 | scanf("%d %d %d %d", &n, &m, &bud, &q);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pyramid_base.cpp:122:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
122 | scanf("%d %d %d %d %d", &rec[i].x1, &rec[i].y1, &rec[i].x2, &rec[i].y2, &cost[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
76 ms |
86392 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
58 ms |
86392 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
70 ms |
86520 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
67 ms |
86648 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
100 ms |
86776 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
317 ms |
86684 KB |
Output is correct |
2 |
Correct |
392 ms |
86952 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
433 ms |
87060 KB |
Output is correct |
2 |
Correct |
357 ms |
86520 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
81 ms |
86760 KB |
Output is correct |
2 |
Correct |
108 ms |
86868 KB |
Output is correct |
3 |
Correct |
128 ms |
86904 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
412 ms |
88928 KB |
Output is correct |
2 |
Correct |
722 ms |
89344 KB |
Output is correct |
3 |
Correct |
583 ms |
89472 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
896 ms |
91512 KB |
Output is correct |
2 |
Correct |
469 ms |
87160 KB |
Output is correct |
3 |
Correct |
205 ms |
91284 KB |
Output is correct |
4 |
Correct |
2103 ms |
95104 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1708 ms |
94280 KB |
Output is correct |
2 |
Correct |
1978 ms |
96404 KB |
Output is correct |
3 |
Correct |
882 ms |
89208 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1475 ms |
92524 KB |
Output is correct |
2 |
Correct |
2716 ms |
99212 KB |
Output is correct |
3 |
Correct |
2480 ms |
99324 KB |
Output is correct |
4 |
Correct |
2717 ms |
99592 KB |
Output is correct |
5 |
Correct |
2608 ms |
98928 KB |
Output is correct |
6 |
Correct |
922 ms |
88568 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5068 ms |
112256 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5075 ms |
114408 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
5083 ms |
117484 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |