Submission #1118907

#TimeUsernameProblemLanguageResultExecution timeMemory
1118907TsaganaLuxury burrow (IZhO13_burrow)C++14
100 / 100
344 ms34128 KiB
#include<bits/stdc++.h> #define IOS ios_base::sync_with_stdio(false);cin.tie();cout.tie(); #define all(x) x.begin(), x.end() #define int long long #define pq priority_queue #define eb emplace_back #define lb lower_bound #define ub upper_bound #define pb push_back #define pp pop_back #define F first #define S second using namespace std; int n, m, k; int a[1001][1001]; int b[1001][1001]; vector<int> v; pair<int, int> ans; bool find(int x) { bool id = 0; int s = 0; int l[1001]; int r[1001]; for (int i = n; i >= 1; i--) for (int j = 1; j <= m; j++) b[i][j] = (a[i][j] < x ? 0 : b[i+1][j]+1); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { l[j] = j-1; while (l[j] >= 1 && b[i][j] <= b[i][l[j]]) l[j] = l[l[j]]; } for (int j = m; j >= 1; j--) { r[j] = j+1; while (r[j] <= m && b[i][j] <= b[i][r[j]]) r[j] = r[r[j]]; s = max(s, (b[i][j] * (r[j] - l[j] - 1))); } } if (s >= k) id = 1; if (id && (ans.F < x || (ans.F == x && ans.S < s))) ans = {x, s}; return id; } void search() { int l = 0, r = v.size()-1; while (l <= r) { int M = (l + r) / 2; if (find(v[M])) l = M+1; else r = M-1; } } void solve () { cin >> n >> m >> k; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> a[i][j]; v.pb(a[i][j]); } } sort(all(v)); search(); cout << ans.F << ' ' << ans.S; } signed main() {IOS solve(); return 0;}
#Verdict Execution timeMemoryGrader output
Fetching results...