#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Rect {
int x1;
int y1;
int x2;
int y2;
int cost;
};
const int N = (int) 4e5 + 7;
const int L = (int) 1e6 + 7;
const int INF = (int) 1e9 + 7;
int dimx;
int dimy;
int budget;
int n;
int initN;
Rect rects[N], initRects[N];
struct Node {
ll mn;
int len;
int sol;
int pref;
int suf;
};
Node tree[4 * L];
ll lazy[4 * L];
Node operator + (Node a, Node b) {
int mn = min(a.mn, b.mn);
int len = a.len + b.len;
int sol;
int pref;
int suf;
if (a.mn == b.mn) {
sol = max(a.suf + b.pref, max(a.sol, b.sol));
pref = a.pref + b.pref * (a.pref == a.len);
suf = b.suf + a.suf * (b.suf == b.len);
} else {
if (a.mn < b.mn) {
sol = a.sol;
pref = a.pref;
suf = 0;
} else {
sol = b.sol;
pref = 0;
suf = b.suf;
}
}
return {mn, len, sol, pref, suf};
}
void build(int v, int tl, int tr) {
lazy[v] = 0;
if (tl == tr) {
tree[v].mn = 0;
tree[v].len = 1;
tree[v].sol = 1;
tree[v].pref = 1;
tree[v].suf = 1;
return;
}
int tm = (tl + tr) / 2;
build(2 * v, tl, tm);
build(2 * v + 1, tm + 1, tr);
tree[v] = tree[2 * v] + tree[2 * v + 1];
}
void push(int v, int tl, int tr) {
if (lazy[v]) {
tree[v].mn += lazy[v];
if (tl < tr) {
lazy[2 * v] += lazy[v];
lazy[2 * v + 1] += lazy[v];
}
lazy[v] = 0;
}
}
void add(int v, int tl, int tr, int l, int r, int x) {
push(v, tl, tr);
if (tr < l || r < tl) {
return;
}
if (l <= tl && tr <= r) {
lazy[v] += x;
push(v, tl, tr);
return;
}
int tm = (tl + tr) / 2;
add(2 * v, tl, tm, l, r, x);
add(2 * v + 1, tm + 1, tr, l, r, x);
tree[v] = tree[2 * v] + tree[2 * v + 1];
}
void build() {
build(1, 1, dimy);
}
void add(int l, int r, int x) {
add(1, 1, dimy, l, r, x);
}
int get() {
/// cout << tree[1].mn << " " << tree[1].len << " ---> " << tree[1].sol << "\n";
if (tree[1].mn == 0) {
return tree[1].sol;
} else {
return 0;
}
}
vector<int> out[L];
vector<int> in[L];
bool isok(int len) {
rects[n + 1].x1 = dimx - len + 2;
rects[n + 1].y1 = 1;
rects[n + 1].x2 = dimx;
rects[n + 1].y2 = dimy;
rects[n + 1].cost = INF;
rects[n + 2].x1 = 1;
rects[n + 2].y1 = dimy - len + 1;
rects[n + 2].x2 = dimx;
rects[n + 2].y2 = dimy;
rects[n + 2].cost = INF;
for (int i = 1; i <= n; i++) {
rects[i] = initRects[i];
rects[i].x1 = max(1, rects[i].x1 - len + 1);
rects[i].y1 = max(1, rects[i].y1 - len + 1);
}
for (int i = 0; i <= dimx + 1; i++) {
in[i].clear();
out[i].clear();
}
for (int i = 1; i <= n + 2; i++) {
in[rects[i].x1].push_back(i);
out[rects[i].x2 + 1].push_back(i);
}
build();
for (int x = 1; x <= dimx; x++) {
for (auto &i : in[x]) add(rects[i].y1, rects[i].y2, rects[i].cost);
for (auto &i : out[x]) add(rects[i].y1, rects[i].y2, -rects[i].cost);
if (tree[1].mn <= budget) {
return 1;
}
}
return 0;
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
///freopen ("input", "r", stdin);
cin >> dimx >> dimy >> budget >> n;
initN = n;
for (int i = 1; i <= n; i++) {
cin >> rects[i].x1 >> rects[i].y1 >> rects[i].x2 >> rects[i].y2 >> rects[i].cost;
in[rects[i].x1].push_back(i);
out[rects[i].x2].push_back(i);
initRects[i] = rects[i];
}
build();
if (budget) {
///assert(0);
///cout << "I will think later about how to solve this subtask\n";
int low = 1, high = min(dimx, dimy), solution = 0;
while (low <= high) {
int mid = (low + high) / 2;
if (isok(mid)) {
solution = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
cout << solution << "\n";
return 0;
}
int missed = 0;
int x2 = 0, sol = 0;
for (int x1 = 1; x1 <= dimx; x1++) {
if (x2 >= x1 - 1) {
for (auto &i : out[x1 - 1]) {
add(rects[i].y1, rects[i].y2, -1);
}
}
x2 = max(x2, x1 - 1);
while (x2 <= dimx && x2 - x1 + 1 <= get()) {
x2++;
for (auto &i : in[x2]) {
add(rects[i].y1, rects[i].y2, +1);
}
if (x2 - x1 + 1 > get()) {
break;
}
}
sol = max(sol, x2 - x1);
}
cout << sol << "\n";
return 0;
}
Compilation message
pyramid_base.cpp: In function 'int main()':
pyramid_base.cpp:198:7: warning: unused variable 'missed' [-Wunused-variable]
198 | int missed = 0;
| ^~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
22 ms |
47240 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
21 ms |
47308 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
22 ms |
47308 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
25 ms |
48352 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
30 ms |
55616 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
85 ms |
113048 KB |
Output is correct |
2 |
Correct |
80 ms |
112996 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
74 ms |
113004 KB |
Output is correct |
2 |
Correct |
77 ms |
113048 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
67 ms |
48904 KB |
Output is correct |
2 |
Correct |
112 ms |
49100 KB |
Output is correct |
3 |
Correct |
96 ms |
49092 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
412 ms |
58976 KB |
Output is correct |
2 |
Incorrect |
581 ms |
59708 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1221 ms |
119588 KB |
Output is correct |
2 |
Incorrect |
123 ms |
54212 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1652 ms |
122768 KB |
Output is correct |
2 |
Correct |
1942 ms |
125688 KB |
Output is correct |
3 |
Incorrect |
1342 ms |
118412 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1788 ms |
121180 KB |
Output is correct |
2 |
Incorrect |
2497 ms |
127812 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
751 ms |
132236 KB |
Output is correct |
2 |
Correct |
366 ms |
69560 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1066 ms |
140940 KB |
Output is correct |
2 |
Correct |
978 ms |
137016 KB |
Output is correct |
3 |
Correct |
590 ms |
128964 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1247 ms |
149316 KB |
Output is correct |
2 |
Correct |
1412 ms |
146748 KB |
Output is correct |
3 |
Correct |
1523 ms |
146788 KB |
Output is correct |
4 |
Correct |
1320 ms |
144436 KB |
Output is correct |
5 |
Correct |
869 ms |
138784 KB |
Output is correct |