Submission #227715

#TimeUsernameProblemLanguageResultExecution timeMemory
227715emil_physmathLuxury burrow (IZhO13_burrow)C++17
100 / 100
1852 ms18168 KiB
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
using namespace std;

int n, m, k;
int price[1000][1000], a[1000][1000];
const int lg = 10;
pair<int, int> t[lg + 1][4000];

inline int pow2(int i) { return 1 << i; }
void Build(vector<int>& a)
{
    int n = a.size();
    for (int i = 0; i < n; ++i)
        t[0][i] = {a[i], i};
    for (int l = 1; l <= lg; ++l)
        for (int i = 0; i + (1 << l) - 1 < n; ++i)
            t[l][i] = min(t[l - 1][i], t[l - 1][i + pow2(l - 1)]);
}
pair<int, int> Min(int l, int r)
{
    int x = __lg(r - l + 1);
    return min(t[x][l], t[x][r - (1 << x) + 1]);
}
int Solve(int l, int r)
{
    queue<pair<int, int>> q;
    q.push({l, r});
    int ans = 0;
    while (q.size())
    {
        l = q.front().first, r = q.front().second;
        q.pop();
        if (l > r)
            continue;
        pair<int, int> p = Min(l, r);
        int hei = p.first, i = p.second;
        ans = max(ans, (r - l + 1) * hei);
        q.push({l, i - 1});
        q.push({i + 1, r});
    }
    return ans;
}
int Solve()
{
    vector<int> up(m);
    int ans = 0;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
            if (a[i][j])
                ++up[j];
            else
                up[j] = 0;
        Build(up);
        ans = max(Solve(0, m - 1), ans);
    }
    return ans;
}
int main()
{
    cin >> n >> m >> k;
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < m; ++j)
            scanf("%d", price[i] + j);
    pair<int, int> ans = {0, n * m};
    int ans_l = 1, ans_r = 1000'000'000;
    while (ans_l <= ans_r)
    {
        int ans_m = (ans_l + ans_r) / 2;
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < m; ++j)
                a[i][j] = (price[i][j] >= ans_m);
        int x = Solve();
        if (x >= k)
        {
            ans = {ans_m, x};
            ans_l = ans_m + 1;
        }
        else
            ans_r = ans_m - 1;
    }
    cout << ans.first << ' ' << ans.second;
}

Compilation message (stderr)

burrow.cpp: In function 'int main()':
burrow.cpp:69:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", price[i] + j);
             ~~~~~^~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...