Submission #171999

#TimeUsernameProblemLanguageResultExecution timeMemory
171999NightmarUFO (IZhO14_ufo)C++17
25 / 100
2080 ms188316 KiB
#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; }
#Verdict Execution timeMemoryGrader output
Fetching results...