답안 #338075

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
338075 2020-12-22T12:24:21 Z boykut UFO (IZhO14_ufo) C++14
60 / 100
2000 ms 172504 KB
#include <bits/stdc++.h>

using namespace std;

#define int long long

signed main() {
   ios::sync_with_stdio(0);
   cin.tie(0);
   
   int n, m, k, r, p;
   cin >> n >> m >> r >> k >> p;
   
   if (n * m <= 10000) {
      int a[n][m];
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            cin >> a[i][j];
         }
      }
      
      for (int i = 0; i < k; i++) {
         char ch; cin >> ch;
         int pos, h; cin >> pos >> h;
         pos--;
         if (ch == 'N') {
            int cnt = 0;
            for (int i = 0; i < n && cnt < r; i++) {
               if (a[i][pos] >= h) {
                  a[i][pos] --;
                  cnt++;
                  if (cnt == r) break;
               }
            }
         } else if (ch == 'E') {
            int cnt = 0;
            for (int i = m - 1; i >= 0 && cnt < r; i--) {
               if (a[pos][i] >= h) {
                  a[pos][i] --;
                  cnt++;
                  if (cnt == r) break;
               }
            }
         } else if (ch == 'W') {
            int cnt = 0;
            for (int i = 0; i < m && cnt < r; i++) {
               if (a[pos][i] >= h) {
                  a[pos][i] --;
                  cnt++;
                  if (cnt == r) break;
               }
            }
         } else {
            int cnt = 0;
            for (int i = n - 1; i >= 0 && cnt < r; i--) {
               if (a[i][pos] >= h) {
                  a[i][pos] --;
                  cnt++;
                  if (cnt == r) break;
               }
            }
         }
      }
      
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
           //cout << a[i][j] << ' ';
         }
         //cout << '\n';
      }
      
      int sum = 0, ans = 0;
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            if (i + p <= n && j + p <= m) {
               sum = 0;
               for (int i1 = i; i1 < i + p; i1++) {
                  for (int j1 = j; j1 < j + p; j1++) {
                     sum += a[i1][j1];
                  }
               }
               if (sum > ans) {
                  //cout << i << ' ' << j << '\n';
                  ans = sum;
                  //cout << sum << "\n\n";
               }
            }
         }
      }
      
      cout << ans << '\n';
   } else {
      
      vector < vector <int> > a(1+n, vector <int> (1+m, 0));
      vector < vector <int> > sum(1+n, vector <int> (1+m, 0));
      
      set <int> col[1+m];
      set <int> row[1+n];
      set <int> del;
      set <int>::iterator it;
      
      for (int i = 1; i <= n; i++) {
         for (int j = 1; j <= m; j++) {
            cin >> a[i][j];
            if (a[i][j] != 0) {
               row[i].insert(j);
               col[j].insert(i);
            }
         }
      }
      for (int tmp = k; tmp--;) {
         char c; cin >> c;
         int pos, h; cin >> pos >> h;
         if (c == 'N') {
            if (col[pos].empty()) continue;
            it = col[pos].begin();
            int cnt = 0;
            for (int temp = col[pos].size(); temp--;) {
               if(a[*it][pos]>=h){
                  a[*it][pos]--;
                  if (a[*it][pos] == 0) del.insert(*it);
                  cnt++;if(cnt==r)break;
               }
               it++;
            }
            for (auto i: del) {
               col[pos].erase(i);
               row[i].erase(pos);
            }
         } else if (c == 'S') {
            if (col[pos].empty()) continue;
            it = col[pos].end(); it--;
            int cnt = 0;
            for (int temp = col[pos].size(); temp--;) {
               if(a[*it][pos]>=h){
                  a[*it][pos]--;
                  if (a[*it][pos] == 0) del.insert(*it);
                  cnt++;if(cnt==r)break;
               }
               it--;
            }
            for (auto i: del) {
               col[pos].erase(i);
               row[i].erase(pos);
            }
         } else if (c == 'W') {
            if (row[pos].empty()) continue;
            it = row[pos].begin();
            int cnt = 0;
            for (int temp = row[pos].size(); temp--;) {
               if(a[pos][*it]>=h){
                  a[pos][*it]--;
                  if (a[pos][*it] == 0) del.insert(*it);
                  cnt++;if(cnt==r)break;
               }
               it++;
            }
            for (auto i: del) {
               row[pos].erase(i);
               col[i].erase(pos);
            }
         } else {
            if (row[pos].empty()) continue;
            it = row[pos].end(); it--;
            int cnt = 0;
            for (int temp = row[pos].size(); temp--;) {
               if(a[pos][*it]>=h){
                  a[pos][*it]--;
                  if (a[pos][*it] == 0) del.insert(*it);
                  cnt++;if(cnt==r)break;
               }
               it--;
            }
            for (auto i: del) {
               row[pos].erase(i);
               col[i].erase(pos);
            }
         }
         while (!del.empty())
            del.erase(del.begin());
      }
      
      for (int i = 1; i <= n; i++) {
         for (int j = 1; j <= m; j++) {
            sum[i][j] = a[i][j];
            sum[i][j] += sum[i-1][j];
            sum[i][j] += sum[i][j-1];
            sum[i][j] -= sum[i-1][j-1];
         }
      }
      
      int ans = 0, A, i2, j2;
      for (int i = 1; i <= n; i++) {
         for (int j = 1; j <= m; j++) {
            i2 = i + p - 1, j2 = j + p - 1;
            if (i2 <= n && j2 <= m) {
               A = sum[i2][j2];
               A -= sum[i2][j-1];
               A -= sum[i-1][j2];
               A += sum[i-1][j-1];
               if (A > ans)
                  ans = A;
            }
         }
      }
      
      cout << ans << '\n';
   }
   return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 6 ms 364 KB Output is correct
5 Correct 63 ms 6252 KB Output is correct
6 Correct 436 ms 54124 KB Output is correct
7 Execution timed out 2058 ms 116188 KB Time limit exceeded
8 Execution timed out 2106 ms 116188 KB Time limit exceeded
9 Correct 1002 ms 113124 KB Output is correct
10 Correct 799 ms 116188 KB Output is correct
11 Correct 665 ms 113216 KB Output is correct
12 Correct 756 ms 116444 KB Output is correct
13 Correct 887 ms 122604 KB Output is correct
14 Correct 528 ms 113088 KB Output is correct
15 Execution timed out 2079 ms 116188 KB Time limit exceeded
16 Execution timed out 2080 ms 113008 KB Time limit exceeded
17 Execution timed out 2088 ms 122476 KB Time limit exceeded
18 Execution timed out 2087 ms 109292 KB Time limit exceeded
19 Execution timed out 2081 ms 122564 KB Time limit exceeded
20 Execution timed out 2049 ms 172504 KB Time limit exceeded