답안 #530583

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
530583 2022-02-25T22:51:52 Z Eyed Pyramid Base (IOI08_pyramid_base) C++17
80 / 100
5000 ms 86852 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, l, min(r, mid), x);
	upd(2 * v + 1, mid + 1, tr, max(l, mid + 1), r, 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, tl, min(r, mid)), qry(2 * v + 1, mid + 1, tr, max(l, mid + 1), r));
} 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 21 ms 47272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 22 ms 47308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 47308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 49612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 82 ms 56544 KB Output is correct
2 Correct 195 ms 65808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 199 ms 65808 KB Output is correct
2 Correct 109 ms 56576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 47664 KB Output is correct
2 Correct 61 ms 47824 KB Output is correct
3 Correct 51 ms 47800 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 133 ms 50476 KB Output is correct
2 Correct 238 ms 50448 KB Output is correct
3 Correct 195 ms 50348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 261 ms 57752 KB Output is correct
2 Correct 50 ms 48496 KB Output is correct
3 Correct 167 ms 66552 KB Output is correct
4 Correct 428 ms 67012 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 426 ms 67300 KB Output is correct
2 Correct 789 ms 67132 KB Output is correct
3 Correct 168 ms 58052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 321 ms 58404 KB Output is correct
2 Correct 1014 ms 67488 KB Output is correct
3 Correct 952 ms 67460 KB Output is correct
4 Correct 1099 ms 67460 KB Output is correct
5 Correct 1029 ms 67488 KB Output is correct
6 Correct 133 ms 58356 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4283 ms 77168 KB Output is correct
2 Correct 317 ms 54696 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5056 ms 82192 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5101 ms 86852 KB Time limit exceeded
2 Halted 0 ms 0 KB -