답안 #171995

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
171995 2019-12-30T18:39:23 Z Nightmar UFO (IZhO14_ufo) C++17
10 / 100
2000 ms 188384 KB
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <iomanip>

#define SWS ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define pb push_back
#define ppb pop_back
#define ft first
#define sd second
#define read freopen("input.txt", "r", stdin)
#define write freopen("output.txt", "w", stdout)
#define files read; write

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int Z = (int)1e3 + 228;
const int N = (int)1e5 + 228;
const int INF = (int)1e9 + 228;
const int MOD = (int)1e9 + 7;

vector<vector<int> > a;
vector<vector<ll> > pref;
vector<vector<int> > t_row, t_col;

void build_row(int ind, int v, int tl, int tr)
{
	if (tl == tr)
	{
		t_row[ind][v] = a[ind][tl];
		return; 
	}
	int mid = (tl + tr) / 2;
	build_row(ind, 2 * v, tl, mid);
	build_row(ind, 2 * v + 1, mid + 1, tr);
	t_row[ind][v] = max(t_row[ind][2 * v], t_row[ind][2 * v + 1]);
}

void build_col(int ind, int v, int tl, int tr)
{
	if (tl == tr)
	{
		t_col[ind][v] = a[tl][ind];
		return;
	}
	int mid = (tl + tr) / 2;
	build_col(ind, 2 * v, tl, mid);
	build_col(ind, 2 * v + 1, mid + 1, tr);
	t_col[ind][v] = max(t_col[ind][2 * v], t_col[ind][2 * v + 1]);
}

void update_row(int ind, int v, int tl, int tr, int pos)
{
	if (tl == tr)
	{
		t_row[ind][v]--;
		return;
	}
	int mid = (tl + tr) / 2;
	if (pos <= mid) update_row(ind, 2 * v, tl, mid, pos);
	else update_row(ind, 2 * v + 1, mid + 1, tr, pos);
	t_row[ind][v] = max(t_row[ind][2 * v], t_row[ind][2 * v + 1]);
}

void update_col(int ind, int v, int tl, int tr, int pos)
{
	if (tl == tr)
	{
		t_col[ind][v]--;
		return;
	}
	int mid = (tl + tr) / 2;
	if (pos <= mid) update_col(ind, 2 * v, tl, mid, pos);
	else update_col(ind, 2 * v + 1, mid + 1, tr, pos);
	t_col[ind][v] = max(t_col[ind][2 * v], t_col[ind][2 * v + 1]); 
}

int max_row(int ind, int v, int tl, int tr, int l, int r)
{
	if (tl >= l && tr <= r)
		return t_row[ind][v];
	if (tl > r || tr < l || l > r)
		return -INF;
	int mid = (tl + tr) / 2;
	return max(max_row(ind, 2 * v, tl, mid, l, r), max_row(ind, 2 * v + 1, mid + 1, tr, l, r));
}

int max_col(int ind, int v, int tl, int tr, int l, int r)
{
	if (tl >= l && tr <= r)
		return t_col[ind][v];
	if (tl > r || tr < l || l > r)
		return -INF;
	int mid = (tl + tr) / 2;
	return max(max_col(ind, 2 * v, tl, mid, l, r), max_col(ind, 2 * v + 1, mid + 1, tr, l, r));
}

int get_up(int ind, int v, int tl, int tr, int l, int r, int h)
{
	if (t_col[ind][v] < h) 
		return -1;
	if (tl > r || tr < l)
		return -1;
	if (tl == tr)
		return tl;
	int mid = (tl + tr) / 2;
	int ql = get_up(ind, 2 * v, tl, mid, l, r, h), qr = get_up(ind, 2 * v + 1, mid + 1, tr, l, r, h);
	if (ql != -1) return ql;
	return qr;
}

int get_down(int ind, int v, int tl, int tr, int l, int r, int h)
{
	if (tl > r || tr < l)
		return -1;
	if (t_col[ind][v] < h) 
		return -1;
	if (tl == tr)
		return tl;
	int mid = (tl + tr) / 2;
	int ql = get_down(ind, 2 * v, tl, mid, l, r, h), qr = get_down(ind, 2 * v + 1, mid + 1, tr, l, r, h);
	if (qr != -1) return qr;
	return ql;
}

int get_left(int ind, int v, int tl, int tr, int l, int r, int h)
{
	if (tl > r || tr < l)
		return -1;
	if (t_row[ind][v] < h) 
		return -1;
	if (tl == tr)
		return tl;
	int mid = (tl + tr) / 2;
	int ql = get_left(ind, 2 * v, tl, mid, l, r, h), qr = get_left(ind, 2 * v + 1, mid + 1, tr, l, r, h);
	if (ql != -1) return ql;
	return qr;
}

int get_right(int ind, int v, int tl, int tr, int l, int r, int h)
{
	if (tl > r || tr < l)
		return -1;
	if (t_row[ind][v] < h)
		return -1;
	if (tl == tr)
		return tl;
	int mid = (tl + tr) / 2;
	int ql = get_right(ind, 2 * v, tl, mid, l, r, h), qr = get_right(ind, 2 * v + 1, mid + 1, tr, l, r, h);
	if (qr != -1) return qr;
	return ql;
}

ll get_pref(int x1, int y1, int x2, int y2)
{
	return pref[x2][y2] - pref[x1 - 1][y2] - pref[x2][y1 - 1] + pref[x1 - 1][y1 - 1];
}

int main()
{
	SWS;
	//files;
	int n, m, r, k, p;
	cin >> n >> m >> r >> k >> p;
	a.resize(n + 1, vector<int> (m + 1, 0));
	pref.resize(n + 1, vector<ll> (m + 1, 0));
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			cin >> a[i][j];
	t_row.resize(n + 1, vector<int> (4 * (m + 5), 0));
	t_col.resize(m + 1, vector<int> (4 * (n + 5), 0));
	for (int i = 1; i <= n; i++)
		build_row(i, 1, 1, m);
	for (int i = 1; i <= m; i++)
		build_col(i, 1, 1, n);
	while (k--)
	{
		char c;
		int num, h;
		cin >> c >> num >> h;
		if (c == 'N')
		{
			int l = 1;
			//cout << "POS : ";
			for (int i = 1; i <= r; i++)
			{
				//if (max_col(num, 1, 1, n, l, n) < h) break;
				int pos = get_up(num, 1, 1, n, l, n, h);
				if (pos == -1) break;
				a[pos][num]--;
				update_col(num, 1, 1, n, pos);
				l = pos + 1;
				//cout << pos << ' ';
			}
			//cout << "\n";
		}
		else if (c == 'S')
		{
			int R = n;
			//cout << "POS : ";
			for (int i = 1; i <= r; i++)
			{
				//if (max_col(num, 1, 1, n, 1, r) < h) break;
				int pos = get_down(num, 1, 1, n, 1, R, h);
				if (pos == -1) break;
				a[pos][num]--;
				update_col(num, 1, 1, n, pos);
				R = pos - 1;
				//cout << pos << ' ';
			}
			//cout << "\n";
		}
		else if (c == 'W')
		{
			int l = 1;
			//cout << "POS : ";
			for (int i = 1; i <= r; i++)
			{
				//if (max_row(num, 1, 1, m, l, m) < h) break;
				int pos = get_left(num, 1, 1, m, l, m, h);
				if (pos == -1) break;
				a[num][pos]--;
				update_row(num, 1, 1, m, pos);
				l = pos + 1;
				//cout << pos << ' ';
			}
			//cout << "\n";
		}
		else
		{
			int R = m;
			//cout << "POS : ";
			for (int i = 1; i <= r; i++)
			{
				//if (max_row(num, 1, 1, m, 1, r) < h) break;
				int pos = get_right(num, 1, 1, m, 1, R, h);
				if (pos == -1) break;
				a[num][pos]--;
				update_row(num, 1, 1, m, pos);
				r = pos - 1;
				//cout << pos << ' ';
			}
			//cout << "\n";
		}
	}
	/*for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
			cout << a[i][j] << ' ';
		cout << endl;
	}*/
	ll ans = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			pref[i][j] = pref[i - 1][j] + pref[i][j - 1] - pref[i - 1][j - 1] + a[i][j];
	for (int i = p; i <= n; i++)
		for (int j = p; j <= m; j++)
			ans = max(ans, get_pref(i - p + 1, j - p + 1, i, j));
	cout << ans;
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 252 KB Output is correct
2 Incorrect 2 ms 376 KB Output isn't correct
3 Incorrect 10 ms 504 KB Output isn't correct
4 Incorrect 466 ms 848 KB Output isn't correct
5 Execution timed out 2039 ms 3192 KB Time limit exceeded
6 Execution timed out 2060 ms 21724 KB Time limit exceeded
7 Execution timed out 2060 ms 57924 KB Time limit exceeded
8 Execution timed out 2055 ms 57924 KB Time limit exceeded
9 Execution timed out 2057 ms 50716 KB Time limit exceeded
10 Execution timed out 2083 ms 57924 KB Time limit exceeded
11 Execution timed out 2054 ms 59168 KB Time limit exceeded
12 Execution timed out 2056 ms 58048 KB Time limit exceeded
13 Execution timed out 2065 ms 66936 KB Time limit exceeded
14 Execution timed out 2068 ms 59168 KB Time limit exceeded
15 Execution timed out 2054 ms 57968 KB Time limit exceeded
16 Execution timed out 2067 ms 59168 KB Time limit exceeded
17 Incorrect 289 ms 68444 KB Output isn't correct
18 Correct 1052 ms 66596 KB Output is correct
19 Execution timed out 2078 ms 72460 KB Time limit exceeded
20 Execution timed out 2065 ms 188384 KB Time limit exceeded