답안 #221470

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
221470 2020-04-10T08:40:05 Z dolphingarlic Pyramid Base (IOI08_pyramid_base) C++14
100 / 100
1426 ms 156260 KB
#include <bits/stdc++.h>
#pragma GCC target("sse4,avx2,fma,avx")
#define FOR(i, x, y) for (int i = x; i < y; i++)
using namespace std;
 
namespace no_remove {
	struct Node {
		int sm, range, mxl, mxr, mxt;
	};
 
	Node segtree[4000001];
	vector<pair<int, int>> add[1000002], subtr[1000002];
 
	void combine(int node, Node l, Node r) {
		if (l.sm) l.mxl = l.mxr = l.mxt = 0;
		if (r.sm) r.mxl = r.mxr = r.mxt = 0;
		segtree[node] = {segtree[node].sm, l.range + r.range,
						 l.mxl + (l.mxl == l.range ? r.mxl : 0),
						 r.mxr + (r.mxl == r.range ? l.mxr : 0),
						 max({l.mxt, r.mxt, l.mxr + r.mxl})};
	}
 
	void build(int node, int l, int r) {
		if (l == r) segtree[node] = {0, 1, 1, 1, 1};
		else {
			int mid = (l + r) / 2;
			build(node * 2, l, mid);
			build(node * 2 + 1, mid + 1, r);
			combine(node, segtree[node * 2], segtree[node * 2 + 1]);
		}
	}
 
	void update(int a, int b, int val, int node, int l, int r) {
		if (l > b || r < a) return;
		if (l >= a && r <= b) segtree[node].sm += val;
		else {
			int mid = (l + r) / 2;
			update(a, b, val, node * 2, l, mid);
			update(a, b, val, node * 2 + 1, mid + 1, r);
			combine(node, segtree[node * 2], segtree[node * 2 + 1]);
		}
	}
 
	void solve(int H, int W) {
		add[H + 1].push_back({1, W});
		int N, C;
		cin >> N;
		FOR(i, 0, N) {
			int x1, y1, x2, y2;
			cin >> x1 >> y1 >> x2 >> y2 >> C;
			add[x1].push_back({y1, y2});
			subtr[x2 + 1].push_back({y1, y2});
		}
		build(1, 1, W);
 
		int ans = 0, rptr = 1;
		FOR(lptr, 1, H + 1) {
			for (pair<int, int> i : subtr[lptr]) update(i.first, i.second, -1, 1, 1, W);
			while ((segtree[1].sm ? 0 : segtree[1].mxt) >= rptr - lptr) {
				for (pair<int, int> i : add[rptr]) update(i.first, i.second, 1, 1, 1, W);
				ans = max(ans, rptr++ - lptr);
			}
		}
		cout << ans;
	}
}
 
namespace yes_remove {
	int lazy[4000001], segtree[4000001];
	vector<array<int, 3>> add[1000002], subtr[1000002];
	
	inline void push_lazy(int node, int l, int r) {
		segtree[node] += lazy[node];
		if (l != r) {
			lazy[node * 2] += lazy[node];
			lazy[node * 2 + 1] += lazy[node];
		}
		lazy[node] = 0;
	}
 
	void update(int a, int b, int val, int node, int l, int r) {
		push_lazy(node, l, r);
		if (l > b || r < a) return;
		if (l >= a && r <= b) {
			lazy[node] = val;
			push_lazy(node, l, r);
		} else {
			int mid = (l + r) / 2;
			update(a, b, val, node * 2, l, mid);
			update(a, b, val, node * 2 + 1, mid + 1, r);
			segtree[node] = min(segtree[node * 2], segtree[node * 2 + 1]);
		}
	}
 
	bool check(int len, int H, int W, int B) {
		memset(segtree, 0, sizeof(segtree));
		memset(lazy, 0, sizeof(lazy));
		update(1, len - 1, B + 1, 1, 1, W);
		FOR(i, 1, len) for (auto j : add[i]) update(j[0], j[1] + len - 1, j[2], 1, 1, W);
		FOR(i, len, H + 1) {
			for (auto j : add[i]) update(j[0], j[1] + len - 1, j[2], 1, 1, W);
			for (auto j : subtr[i - len + 1]) update(j[0], j[1] + len - 1, -j[2], 1, 1, W);
			if (segtree[1] <= B) return true;
		}
		return false;
	}
 
	void solve(int H, int W, int B) {
		int N;
		cin >> N;
		FOR(i, 0, N) {
			int x1, y1, x2, y2, c;
			cin >> x1 >> y1 >> x2 >> y2 >> c;
			add[x1].push_back({y1, y2, c});
			subtr[x2 + 1].push_back({y1, y2, c});
		}
 
		int l = 1, r = min(H, W);
		while (l != r) {
			int mid = (l + r + 1) / 2;
			if (check(mid, H, W, B)) l = mid;
			else r = mid - 1;
		}
		cout << l;
	}
}
 
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int H, W, B;
	cin >> H >> W >> B;
	if (B) yes_remove::solve(H, W, B);
	else no_remove::solve(H, W);
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 63 ms 94336 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 94328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 61 ms 94328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 65 ms 94968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 99448 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 111 ms 135416 KB Output is correct
2 Correct 121 ms 135416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 135416 KB Output is correct
2 Correct 111 ms 135416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 161 ms 125944 KB Output is correct
2 Correct 228 ms 125864 KB Output is correct
3 Correct 183 ms 125816 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 332 ms 126584 KB Output is correct
2 Correct 430 ms 126456 KB Output is correct
3 Correct 417 ms 126424 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 542 ms 126868 KB Output is correct
2 Correct 138 ms 126968 KB Output is correct
3 Correct 255 ms 126328 KB Output is correct
4 Correct 695 ms 126968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 839 ms 127096 KB Output is correct
2 Correct 1178 ms 127096 KB Output is correct
3 Correct 602 ms 127224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 905 ms 127480 KB Output is correct
2 Correct 1308 ms 127480 KB Output is correct
3 Correct 1391 ms 127352 KB Output is correct
4 Correct 1426 ms 127352 KB Output is correct
5 Correct 1415 ms 127480 KB Output is correct
6 Correct 681 ms 127352 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 709 ms 146656 KB Output is correct
2 Correct 413 ms 105720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 940 ms 151800 KB Output is correct
2 Correct 941 ms 148324 KB Output is correct
3 Correct 595 ms 141764 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1167 ms 156260 KB Output is correct
2 Correct 1358 ms 154340 KB Output is correct
3 Correct 1396 ms 154088 KB Output is correct
4 Correct 1255 ms 152416 KB Output is correct
5 Correct 904 ms 146772 KB Output is correct