Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include<iostream>
- #include <algorithm>
- #include <cmath>
- #include <iomanip>
- #include <fstream>
- #include <string>
- #include <set>
- #include <deque>
- #include <queue>
- #include <map>
- #include <bitset>
- #include <random>
- #include <cassert>
- #include <unordered_map>
- #include <unordered_set>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- #define endl "\n"
- #define all(a) a.begin(), a.end()
- #define allr(a) a.rbegin(), a.rend()
- #define pb push_back
- #define F first
- #define S second
- ll inf = 1e18;
- const ll c = 600;
- struct point {
- ld x, y;
- };
- struct Vector {
- ld x, y;
- Vector(ld x_ = 0, ld y_ = 0) {
- x = x_;
- y = y_;
- }
- Vector(point& a, point& b) {
- x = b.x - a.x;
- y = b.y - a.y;
- }
- };
- const ll mod = 1e9 + 7;
- template<typename T>
- T SUM(T x) {
- return x;
- }
- template<typename T, typename... Ts>
- T SUM(T x, Ts... y) {
- T res = x + SUM(y...);
- if (res >= mod)
- res -= mod;
- return res;
- }
- template<typename T, typename... Ts>
- T sub(T x, Ts... y) {
- return SUM(x, mod - SUM(y...));
- }
- template<typename T>
- T proiz(T x) {
- return x;
- }
- template<typename T, typename... Ts>
- T proiz(T x, Ts... y) {
- return (x * 1ll * proiz(y...)) % mod;
- }
- template<typename T, typename... Ts>
- void prisvoenie_proiz(T& x, Ts... y) {
- x = proiz(x, y...);
- }
- ll bin(ll a, ll deg) {
- ll r = 1;
- while (deg) {
- if (deg & 1)
- prisvoenie_proiz(r, a);
- deg >>= 1;
- prisvoenie_proiz(a, a);
- }
- return r;
- }
- ll inv(ll x) {
- return bin(x, mod - 2);
- }
- void solve() {
- ll n, m;
- cin >> m >> n;
- vector<vector<ll>> a(m, vector<ll>(n));
- for (ll i = 0; i < m; i++) {
- for (ll j = 0; j < n; j++) {
- cin >> a[i][j];
- }
- }
- vector <ll> h(n + 2,0);
- ll mxans = -inf;
- for (ll j = 0; j < m; j++) {
- h[0] = -inf;
- h[n + 1] = -inf;
- for (ll i = 1; i <= n; i++) {
- if (!a[j][i - 1]) {
- h[i]++;
- }
- else {
- h[i] = 0;
- }
- }
- vector <ll> stack1(1, 0), stack2(1, n + 1), ans1(n + 2), ans2(n + 2);
- for (ll i = 1; i < n + 2; i++) {
- while (h[stack1.back()] > h[i]) {
- ans1[stack1.back()] = i;
- stack1.pop_back();
- }
- stack1.push_back(i);
- }
- for (ll i = n + 1; i >= 1; i--) {
- while (h[stack2.back()] > h[i]) {
- ans2[stack2.back()] = i;
- stack2.pop_back();
- }
- stack2.push_back(i);
- }
- ll anss = -inf;
- for (ll i = 1; i <= n; i++) {
- anss = max(anss, h[i] * (ans1[i] - 1 - (ans2[i] + 1) + 1));
- }
- mxans = max(anss, mxans);
- }
- cout << mxans << endl;
- }
- signed main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- ll t = 1;
- //cin >> t;
- while (t--) {
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement