Submission #344703

# Submission time Handle Problem Language Result Execution time Memory
344703 2021-01-06T09:42:52 Z _ani UFO (IZhO14_ufo) C++17
25 / 100
2000 ms 143520 KB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
const int inf = 1'000'000'000;
vector<vector<ll>> a;
vector<vector<ll>> tr, tc;
void Buildr(int v, int vl, int vr, int i) {//checked
	if (vl == vr) {
		tr[i][v] = a[i][vl];
		return;
	}
	int m = (vl + vr) / 2;
	Buildr(v * 2, vl, m, i);
	Buildr(v * 2 + 1, m + 1, vr, i);
	tr[i][v] = max(tr[i][v * 2], tr[i][v * 2 + 1]);
}
void Buildc(int v, int vl, int vr, int j) {//checked
	if (vl == vr) {
		tc[j][v] = a[vl][j];
		return;
	}
	int m = (vl + vr) / 2;
	Buildc(v * 2, vl, m, j);
	Buildc(v * 2 + 1, m + 1, vr, j);
	tc[j][v] = max(tc[j][v * 2], tc[j][v * 2 + 1]);
}
int RFirstGreater(int v, int vl, int vr, int l, int i, ll k) {//checked
	if (vl == vr) {
		if (tr[i][v] >= k)return vl;
		return inf;
	}
	int m = (vl + vr) / 2;
	if (l > m)return RFirstGreater(v * 2 + 1, m + 1, vr, l, i, k);
	int res = inf;
	if (tr[i][v * 2 + 1] >= k)
		res = min(res, RFirstGreater(v * 2 + 1, m + 1, vr, l, i, k));
	res = min(res, RFirstGreater(v * 2, vl, m, l, i, k));
	return res;
}
int RLastGreater(int v, int vl, int vr, int r, int i, ll k) {//checked
	if (vl == vr) {
		if (tr[i][v] >= k)return vl;
		return -1;
	}
	int m = (vl + vr) / 2;
	if (r <= m)
		return RLastGreater(v * 2, vl, m, r, i, k);
	///
	int res = -1;
	if (tr[i][v * 2 + 1] >= k)
		res = max(res, RLastGreater(v * 2 + 1, m + 1, vr, r, i, k));
	res = max(res, RLastGreater(v * 2, vl, m, r, i, k));
	return res;
}
int CFirstGreater(int v, int vl, int vr, int l, int j, ll k) {//checked
	if (vl == vr) {
		if (tc[j][v] >= k)return vl;
		return inf;
	}
	int m = (vl + vr) / 2;
	if (l > m)return CFirstGreater(v * 2 + 1, m + 1, vr, l, j, k);
	int res = inf;
	if (tc[j][v * 2 + 1] >= k)
		res = min(res, CFirstGreater(v * 2 + 1, m + 1, vr, l, j, k));
	res = min(res, CFirstGreater(v * 2, vl, m, l, j, k));
	return res;
}
ll Get(int v, int vl, int vr, int i, int j) {//checked
	if (vl == vr)return tr[i][v];
	int m = (vl + vr) / 2;
	if (j <= m)return Get(v * 2, vl, m, i, j);
	return Get(v * 2 + 1, m + 1, vr, i, j);
}
int CLastGreater(int v, int vl, int vr, int r, int j, ll k) {//checked
	if (vl == vr) {
		if (tc[j][v] >= k)return vl;
		return -1;
	}
	int m = (vl + vr) / 2;
	int res = -1;
	if (r <= m)return CLastGreater(v * 2, vl, m, r, j, k);
	if (tc[j][v * 2 + 1] >= k)
		res = max(res, CLastGreater(v * 2 + 1, m + 1, vr, r, j, k));
	res = max(res, CLastGreater(v * 2, vl, m, r, j, k));
	return res;
}
void RUpd(int v, int vl, int vr, int i, int j) {//checked
	if (vl == vr) {
		tr[i][v]--;
		return;
	}
	int m = (vl + vr) / 2;
	if (j <= m)
		RUpd(v * 2, vl, m, i, j);
	else
		RUpd(v * 2 + 1, m + 1, vr, i, j);
	tr[i][v] = max(tr[i][v * 2], tr[i][v * 2 + 1]);
}
void CUpd(int v, int vl, int vr, int i, int j) {//checked
	if (vl == vr) {
		tc[j][v]--;
		return;
	}
	int m = (vl + vr) / 2;
	if (i <= m)
		CUpd(v * 2, vl, m, i, j);
	else
		CUpd(v * 2 + 1, m + 1, vr, i, j);
	tc[j][v] = max(tc[j][v * 2], tc[j][v * 2 + 1]);
}
int main() {
	int n, m, r, k, p;
	cin >> n >> m >> r >> k >> p;
	a.resize(n);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			ll x;
			cin >> x;
			a[i].push_back(x);
		}
	tr.resize(n);
	for (int i = 0; i < n; i++) {
		tr[i].resize(4 * m + 4);
		Buildr(1, 0, m - 1, i);
	}
	tc.resize(m);
	for (int j = 0; j < m; j++) {
		tc[j].resize(4 * n + 4);
		Buildc(1, 0, n - 1, j);
	}
	while (k--)
	{
		char s;
		int x, h;
		cin >> s >> x >> h;
		x--;
		int ind;
		if (s == 'W' || s == 'N')ind = -1;
		else ind = inf;
		for (int i = 0; i < r; i++) {
			if (s == 'W') {
				int cur = RFirstGreater(1, 0, m - 1, ind + 1, x, h);
			//	cerr << "cur index " << cur << '\n';
				if (cur == inf) break;
				RUpd(1, 0, m - 1, x, cur);
				CUpd(1, 0, n - 1, x, cur);
				ind = cur;
				if (ind + 1 >= m)
					break;
			}
			if (s == 'N') {
				int cur = CFirstGreater(1, 0, n - 1, ind + 1, x, h);
			//	cerr << "cur index " << cur << '\n';
				if (cur == inf) break;
				RUpd(1, 0, m - 1, cur, x);
				CUpd(1, 0, n - 1, cur, x);
				ind = cur;
				if (ind + 1 >= n)
					break;
			}
			if (s == 'E') {
				int cur = RLastGreater(1, 0, m - 1, min(ind, m) - 1, x, h);
			//	cerr << "cur index " << cur << '\n';
				if (cur == -1) break;
				RUpd(1, 0, m - 1, x, cur);
				CUpd(1, 0, n - 1, x, cur);
				ind = cur;
				if (ind - 1 < 0)
					break;
			}
			if (s == 'S') {
				int cur = CLastGreater(1, 0, n - 1, min(ind, n) - 1, x, h);
			//	cerr << "cur index " << cur << '\n';
				if (cur == -1) break;
				RUpd(1, 0, m - 1, cur, x);
				CUpd(1, 0, n - 1, cur, x);
				ind = cur;
				if (ind - 1 < 0)
					break;
			}
		}
	}
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			a[i][j] = Get(1, 0, m - 1, i, j);
	ll ans = 0;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
		//	cerr << a[i][j] << ' ';
			if (i + p > n || j + p > m)continue;
			ll cur = 0;
			for (int x = i; x < i + p; x++)
				for (int y = j; y < j + p; y++)
					cur += a[x][y];
			ans = max(ans, cur);
		}
		//cerr << '\n';
	}
	cout << ans << '\n';
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 3 ms 492 KB Output is correct
4 Correct 87 ms 1132 KB Output is correct
5 Execution timed out 2088 ms 4716 KB Time limit exceeded
6 Execution timed out 2096 ms 40000 KB Time limit exceeded
7 Execution timed out 2067 ms 83808 KB Time limit exceeded
8 Execution timed out 2047 ms 80900 KB Time limit exceeded
9 Execution timed out 2041 ms 76552 KB Time limit exceeded
10 Execution timed out 2045 ms 80096 KB Time limit exceeded
11 Execution timed out 2068 ms 78432 KB Time limit exceeded
12 Execution timed out 2094 ms 79988 KB Time limit exceeded
13 Execution timed out 2092 ms 88684 KB Time limit exceeded
14 Execution timed out 2087 ms 78560 KB Time limit exceeded
15 Execution timed out 2084 ms 81120 KB Time limit exceeded
16 Execution timed out 2082 ms 79840 KB Time limit exceeded
17 Execution timed out 2084 ms 92140 KB Time limit exceeded
18 Correct 1791 ms 79084 KB Output is correct
19 Execution timed out 2084 ms 87484 KB Time limit exceeded
20 Execution timed out 2097 ms 143520 KB Time limit exceeded