#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 |