답안 #530581

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
530581 2022-02-25T22:42:25 Z Eyed Pyramid Base (IOI08_pyramid_base) C++17
80 / 100
5000 ms 89236 KB
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const ll MOD = 1e9 + 7;

int n, m, b, p;
struct rType {
	int y1;
	int y2;
	int c;
	rType(int yy1 = 0, int yy2 = 0, int cc = 0) : y1(yy1), y2(yy2), c(cc) {};
};

vector<rType> addRect[1000005];
vector<rType> subRect[1000005];

int seg[4000020];
int lazy[4000020];
bool mark[4000020];

void build(int v, int tl, int tr) {
	lazy[v] = 0;
	seg[v] = 0;
	mark[v] = false;
	if (tl == tr) return;
	int mid = (tl + tr) / 2;
	build(2 * v, tl, mid);
	build(2 * v + 1, mid + 1, tr);
} void build() { build(1, 0, m - 1); }
void push(int v) {
	if (mark[v]) {
		lazy[2 * v] += lazy[v];
		lazy[2 * v + 1] += lazy[v];
		mark[2 * v] = true;
		mark[2 * v + 1] = true;
		seg[2 * v] += lazy[v];
		seg[2 * v + 1] += lazy[v];
		lazy[v] = 0;
		mark[v] = false;
	}
}
void upd(int v, int tl, int tr, int l, int r, int x) {
	if (l > r) return;
	if (l <= tl && r >= tr) {
		lazy[v] += x;
		seg[v] += x;
		mark[v] = true;
		return;
	}
	push(v);
	int mid = (tl + tr) / 2;
	upd(2 * v, tl, mid, max(l, tl), min(r, mid), x);
	upd(2 * v + 1, mid + 1, tr, max(l, mid + 1), min(r, tr), x);
	seg[v] = min(seg[2 * v], seg[2 * v + 1]);
} void upd(int l, int r, int x) { upd(1, 0, m - 1, l, r, x); }

int qry(int v, int tl, int tr, int l, int r) {
	if (l > r) return 1e9;
	if (l <= tl && r >= tr) return seg[v];
	push(v);
	int mid = (tl + tr) / 2;
	return min(qry(2 * v, tl, mid, max(l, tl), min(r, mid)), qry(2 * v + 1, mid + 1, tr, max(l, mid + 1), min(r, tr)));
} int qry(int l, int r) { return qry(1, 0, m - 1, l, r); }

bool check(int p) {

	build(1, p-1, m-1);
	for (int i = 0; i < p; ++i) {
		for (rType r : addRect[i]) {
			upd(1, p-1, m-1, max(r.y1, p - 1), min(m - 1, r.y2 + p - 1), r.c);
		}
	}
	if (qry(1, p-1, m-1, p - 1, m - 1) <= b) return true;
	for (int i = p; i < n; ++i) {
		bool hasChange = false;
		for (rType r : addRect[i]) {
			upd(1, p-1, m-1, max(r.y1, p - 1), min(m - 1, r.y2 + p - 1), r.c);
			hasChange = true;
		}
		for (rType r : subRect[i - p]) {
			upd(1, p-1, m-1, max(r.y1, p - 1), min(m - 1, r.y2 + p - 1), -r.c);
			hasChange = true;
		}
		if (!hasChange) continue;
		if (qry(1, p-1, m-1, p - 1, m - 1) <= b) return true;
	}
	return false;

}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> n >> m;
	cin >> b;
	cin >> p;
	for (int i = 0; i < p; ++i) {
		int x1, y1, x2, y2, c;
		cin >> x1 >> y1 >> x2 >> y2 >> c;
		--x1; --y1; --x2; --y2;
		addRect[x1].push_back(rType(y1, y2, c));
		subRect[x2].push_back(rType(y1, y2, c));
	}
	int l = 0;
	int r = min(m, n);
	while (l < r) {
		int mid = (l + r + 1) / 2;
		if (check(mid)) l = mid;
		else r = mid - 1;
	}
	cout << l << endl;

	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 28 ms 47276 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 47280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 47276 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 47552 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 49572 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 97 ms 56600 KB Output is correct
2 Correct 210 ms 65788 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 202 ms 65860 KB Output is correct
2 Correct 111 ms 56600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 47696 KB Output is correct
2 Correct 64 ms 47912 KB Output is correct
3 Correct 52 ms 47820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 180 ms 50844 KB Output is correct
2 Correct 281 ms 50868 KB Output is correct
3 Correct 206 ms 50764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 258 ms 58340 KB Output is correct
2 Correct 44 ms 48896 KB Output is correct
3 Correct 215 ms 66884 KB Output is correct
4 Correct 449 ms 67616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 438 ms 68016 KB Output is correct
2 Correct 876 ms 67748 KB Output is correct
3 Correct 175 ms 58848 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 425 ms 59204 KB Output is correct
2 Correct 1040 ms 68460 KB Output is correct
3 Correct 1083 ms 68320 KB Output is correct
4 Correct 1102 ms 68324 KB Output is correct
5 Correct 1174 ms 68340 KB Output is correct
6 Correct 146 ms 59208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4639 ms 79600 KB Output is correct
2 Correct 340 ms 60032 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5076 ms 84620 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5027 ms 89236 KB Time limit exceeded
2 Halted 0 ms 0 KB -