답안 #547685

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
547685 2022-04-11T11:54:36 Z SmolBrain 호화 벙커 (IZhO13_burrow) C++17
100 / 100
694 ms 25664 KB
// Om Namah Shivaya
// GM in 114 days

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

typedef long long int ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define endl '\n'
#define pb push_back
#define conts continue
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "YES" << endl
#define no cout << "NO" << endl
#define ff first
#define ss second
#define ceil2(x,y) ((x+y-1) / (y))
#define sz(a) a.size()
#define setbits(x) __builtin_popcountll(x)
#ifndef ONLINE_JUDGE
#define debug(x) cout << #x <<" = "; print(x); cout << endl
#else
#define debug(x)
#endif

#define rep(i,n) for(int i = 0; i < n; ++i)
#define rep1(i,n) for(int i = 1; i <= n; ++i)
#define rev(i,s,e) for(int i = s; i >= e; --i)
#define trav(i,a) for(auto &i : a)

bool iseven(ll n) {if ((n & 1) == 0) return true; return false;}

void print(ll t) {cout << t;}
void print(int t) {cout << t;}
void print(string t) {cout << t;}
void print(char t) {cout << t;}
void print(double t) {cout << t;}
void print(ld t) {cout << t;}

template <class T, class V> void print(pair <T, V> p);
template <class T> void print(vector <T> v);
template <class T> void print(set <T> v);
template <class T, class V> void print(map <T, V> v);
template <class T> void print(multiset <T> v);
template <class T, class V> void print(pair <T, V> p) {cout << "{"; print(p.ff); cout << ","; print(p.ss); cout << "}";}
template <class T> void print(vector <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";}
template <class T> void print(set <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";}
template <class T> void print(multiset <T> v) {cout << "[ "; for (T i : v) {print(i); cout << " ";} cout << "]";}
template <class T, class V> void print(map <T, V> v) {cout << "[ "; for (auto i : v) {print(i); cout << " ";} cout << "]";}
template<typename T> void amin(T &a, T b) { a = min(a, b); }
template<typename T> void amax(T &a, T b) { a = max(a, b); }

void usaco(string filename) {
    freopen((filename + ".in").c_str(), "r", stdin);
    freopen((filename + ".out").c_str(), "w", stdout);
}

const int MOD = 1e9 + 7;
const int maxn = 1e5 + 5;
const int inf1 = 1e9 + 5;
const ll inf2 = ll(1e18) + 5;

void solve(int test_case)
{

    /*

    thanks to "Anuj Bhaiya" for making this video: https://youtu.be/oaN9ibZKMpA

    approach:
    binary search on the answer
    the array a[][] is simplified to b[][], which is a binary matrix
    so the problem has been reduced to the following:
    find the max area subrectangle of 1s in a binary matrix
    this can be solved using the following approach: https://youtu.be/oaN9ibZKMpA

    */

    ll n, m, k; cin >> n >> m >> k;
    ll a[n][m], b[n][m];
    rep(i, n) rep(j, m) cin >> a[i][j];

    ll l = 1, r = 1e9;
    ll mncost = -1, mxarea = -1;

    while (l <= r) {
        ll mid = (l + r) / 2;

        rep(i, n) rep(j, m) b[i][j] = (a[i][j] >= mid);

        vector<ll> arr(m);
        ll currmx = 0;

        rep(i, n) {
            rep(j, m) {
                if (b[i][j]) {
                    arr[j]++;
                }
                else {
                    arr[j] = 0;
                }
            }

            vector<ll> nseleft(m, -1), nseright(m, m);
            stack<ll> st;

            rep(j, m) {
                while (!st.empty() and arr[j] < arr[st.top()]) {
                    nseright[st.top()] = j;
                    st.pop();
                }

                st.push(j);
            }

            while (!st.empty()) st.pop();

            rev(j, m - 1, 0) {
                while (!st.empty() and arr[j] < arr[st.top()]) {
                    nseleft[st.top()] = j;
                    st.pop();
                }

                st.push(j);
            }

            while (!st.empty()) st.pop();

            rep(j, m) {
                ll l = nseleft[j] + 1, r = nseright[j] - 1;
                ll len = r - l + 1;
                ll area = len * arr[j];
                amax(currmx, area);
            }
        }

        if (currmx >= k) {
            mncost = mid;
            mxarea = currmx;
            l = mid + 1;
        }
        else {
            r = mid - 1;
        }
    }

    cout << mncost << " " << mxarea << endl;
}

int main()
{
    fastio;

    int t = 1;
    // cin >> t;
    rep1(i, t) {
        solve(i);
    }

    return 0;
}

Compilation message

burrow.cpp: In function 'void usaco(std::string)':
burrow.cpp:64:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |     freopen((filename + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
burrow.cpp:65:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |     freopen((filename + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 320 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 6 ms 468 KB Output is correct
9 Correct 10 ms 724 KB Output is correct
10 Correct 26 ms 1228 KB Output is correct
11 Correct 50 ms 1892 KB Output is correct
12 Correct 27 ms 1236 KB Output is correct
13 Correct 40 ms 1612 KB Output is correct
14 Correct 86 ms 3320 KB Output is correct
15 Correct 86 ms 3404 KB Output is correct
16 Correct 97 ms 3908 KB Output is correct
17 Correct 108 ms 4744 KB Output is correct
18 Correct 286 ms 8856 KB Output is correct
19 Correct 286 ms 9840 KB Output is correct
20 Correct 575 ms 15916 KB Output is correct
21 Correct 522 ms 19256 KB Output is correct
22 Correct 659 ms 25664 KB Output is correct
23 Correct 694 ms 25612 KB Output is correct
24 Correct 429 ms 14892 KB Output is correct
25 Correct 475 ms 18804 KB Output is correct