답안 #341657

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
341657 2020-12-30T11:04:57 Z tengiz05 호화 벙커 (IZhO13_burrow) C++17
100 / 100
1666 ms 33700 KB
#include <bits/stdc++.h>
#define int long long
#define all(x) (x).begin(), (x).end()
typedef long long ll;
using namespace std;
template<class T> bool chmin(T& a, const T& b){return a>b?a=b,true:false;}
template<class T> bool chmax(T& a, const T& b){return a<b?a=b,true:false;}
const int N = 1005;
const int inf = 100200300;
int n, m, k;
int a[N][N], inp[N][N];
int h[N][N];
void Solve(){
  cin >> n >> m >> k;
  for(int i=1;i<=n;i++){
    for(int j=1;j<=m;j++){
      cin >> inp[i][j];
    }
  }
  int L = -1, R = inf+inf;
  int resmn = 0, resmx = 0;
  int iter = 0;
  while(iter < 64){
    iter++;
    int mid = L+R>>1;
    for(int i=1;i<=n;i++){
      for(int j=1;j<=m;j++){
        if(inp[i][j] >= mid){
          a[i][j] = 1;
        }else a[i][j] = 0;
      }
    }
    // start fermer-2 ------------------------
    int ans = 0;
    for(int i=1;i<=n;i++){
      for(int j=1;j<=m;j++){
        if(a[i][j] == 0)h[i][j] = 0;
        else h[i][j] = h[i-1][j] + 1;
      }
    }
    for(int i=1;i<=n;i++){
      vector<int> v;
      vector<int> l(m+2), r(m+2);
      v.push_back(0);
      for(int j=1;j<=m;j++){
        v.push_back(h[i][j]);
      }
      vector<pair<int, int>> q;
      q.push_back({0, 0});
      for(int j=1;j<=m;j++){
        if(v[j] == 0)q.clear(),q.push_back({0, j});
        else {
          while(q.back().first >= v[j])q.pop_back();
          int lst = q.back().second;
          l[j] = lst;
          q.push_back({v[j], j});
        }
      }
      q.clear();
      q.push_back({0,m+1});
      for(int j=m;j>=1;j--){
        if(v[j] == 0)q.clear(),q.push_back({0, j});
        else {
          while(q.back().first >= v[j])q.pop_back();
          int lst = q.back().second;
          r[j] = lst;
          q.push_back({v[j], j});
        }
      }
      for(int j=1;j<=m;j++){
        chmax(ans, (r[j]-l[j]-1)*v[j]);
      }
    }// end fermer-2 ------------------------

    if(ans >= k){
      L = mid;
      if(mid >= resmn){
        resmn = mid;
        resmx = ans;
      }
    }else R = mid;
  }
  cout << resmn << ' ' << resmx << '\n';
}

signed main(){
  ios_base::sync_with_stdio(false);
  cin.tie();
  int t=1;
  while(t--)Solve();
  return 0;
}

Compilation message

burrow.cpp: In function 'void Solve()':
burrow.cpp:25:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   25 |     int mid = L+R>>1;
      |               ~^~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 492 KB Output is correct
4 Correct 2 ms 620 KB Output is correct
5 Correct 3 ms 748 KB Output is correct
6 Correct 4 ms 876 KB Output is correct
7 Correct 2 ms 492 KB Output is correct
8 Correct 22 ms 1772 KB Output is correct
9 Correct 39 ms 3180 KB Output is correct
10 Correct 83 ms 3760 KB Output is correct
11 Correct 148 ms 4972 KB Output is correct
12 Correct 114 ms 7532 KB Output is correct
13 Correct 100 ms 2668 KB Output is correct
14 Correct 310 ms 8940 KB Output is correct
15 Correct 345 ms 9452 KB Output is correct
16 Correct 295 ms 10072 KB Output is correct
17 Correct 374 ms 12652 KB Output is correct
18 Correct 760 ms 17376 KB Output is correct
19 Correct 1075 ms 18940 KB Output is correct
20 Correct 1560 ms 24940 KB Output is correct
21 Correct 1395 ms 27924 KB Output is correct
22 Correct 1666 ms 33700 KB Output is correct
23 Correct 1622 ms 33636 KB Output is correct
24 Correct 1556 ms 25836 KB Output is correct
25 Correct 1629 ms 26988 KB Output is correct