답안 #530582

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
530582 2022-02-25T22:48:49 Z Eyed Pyramid Base (IOI08_pyramid_base) C++14
80 / 100
5000 ms 86880 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 22 ms 47180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 47224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 47228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 47576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 55 ms 49608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 92 ms 56572 KB Output is correct
2 Correct 198 ms 65780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 224 ms 65780 KB Output is correct
2 Correct 116 ms 56576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 27 ms 47684 KB Output is correct
2 Correct 65 ms 47812 KB Output is correct
3 Correct 56 ms 47820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 152 ms 50488 KB Output is correct
2 Correct 319 ms 50448 KB Output is correct
3 Correct 226 ms 50280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 267 ms 57748 KB Output is correct
2 Correct 45 ms 48400 KB Output is correct
3 Correct 172 ms 66460 KB Output is correct
4 Correct 444 ms 67084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 447 ms 67364 KB Output is correct
2 Correct 810 ms 67120 KB Output is correct
3 Correct 174 ms 58052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 326 ms 58272 KB Output is correct
2 Correct 1225 ms 67488 KB Output is correct
3 Correct 1095 ms 67396 KB Output is correct
4 Correct 1149 ms 67460 KB Output is correct
5 Correct 1096 ms 67488 KB Output is correct
6 Correct 147 ms 58244 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4849 ms 77168 KB Output is correct
2 Correct 368 ms 54596 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5083 ms 82184 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5091 ms 86880 KB Time limit exceeded
2 Halted 0 ms 0 KB -