Submission #1217105

#TimeUsernameProblemLanguageResultExecution timeMemory
1217105thunopro3D Histogram (COCI20_histogram)C++20
0 / 110
1 ms320 KiB
#include<bits/stdc++.h>
using namespace std ; 
#define int long long 
#define maxn 200009
#define ll long long 
#define pb push_back 
#define fi first 
#define se second 
#define left id<<1
#define right id<<1|1 
#define re exit(0); 
#define _lower(x) lower_bound(v.begin(),v.end(),x)-v.begin()+1 
#define TIME ( 1.0*clock() / CLOCKS_PER_SEC )
const int mod = 1e9+7 ;
const ll INF = 1e18; 

typedef vector<int> vi ; 
typedef pair<int,int> pii ; 
typedef vector<pii> vii ; 

template < typename T > void chkmin ( T &a , T b ) { if ( a > b ) a = b ; } 
template < typename T > void chkmax ( T &a , T b ) { if ( a < b ) a = b ; } 

void add ( int &a , int b ) 
{
    a += b ; 
    if ( a >= mod ) a -= mod ; 
    if ( a < 0 ) a += mod ; 
}

void rf () 
{
#ifndef ONLINE_JUDGE
freopen("bai1.inp","r",stdin);
freopen ("bai1.out","w",stdout) ;
#endif
}

int _pow ( int a , int n ) 
{
    if ( n == 0 ) return 1 ; 
    int res = _pow (a,n/2) ; 
    if ( n % 2 ) return 1ll*res*res%mod*a%mod ; 
    else return 1ll*res*res%mod ; 
}

int n ; 
int a [maxn] , b [maxn] ; 
ll res = 0 ; 

struct Line 
{
    int m , b ; 
    int eval ( int x ) 
    {
        return m*x + b ; 
    }
    long double intersect ( Line l ) 
    {
        return ((long double) l.b - b ) / ( m -l.m ) ; 
    }
}; 

struct Hull{
    deque <Line> dq ; 
    void add_line ( Line l ) 
    {
        if ( dq.size () && dq [0].b >= l.b ) return ; 
        if ( dq.size () && dq [0].m == l.m ) 
        {
            l.m = max (l.m,dq [0].m) ; 
            dq.pop_front() ; 
        }

        while (dq.size() >= 2 && dq [0].intersect(dq[1]) <= dq [1].intersect(l)) dq.pop_front() ; 

        dq.push_front(l) ; 
    }
    int query ( int x ) 
    {
        if ( dq.empty() ) return - INF ; 
        while (dq.size () >= 2 && dq [0].intersect(dq[1]) < x ) dq.pop_front() ; 
        return dq[0].eval(x) ; 
    }
}; 

void calc ( vii L , vii R ) 
{
    int N = R.size () ; 
    vector<Hull> bit (N+1) ; 
    auto add_bitline = [&] ( int p , Line l ) 
    {
        p = N - p ; 
        for ( int i = p ; i <= N ; i += (i&-i)) bit [i].add_line(l) ; 
    }; 
    auto query = [&] ( int p , int x ) 
    {
        p = N - p ; 
        int res = 0 ; 
        for ( int i = p ; i > 0 ; i -= (i&-i)) chkmax (res,bit[i].query(x)) ; 
        return res ; 
    }; 

    int p1 = 0 , p2 = 0 ; 
    int cnt = 0 ; 

    for ( auto x : L ) 
    {
        while ( p1 < R.size () && R[p1].fi >= x.fi && R[p1].se >= x.se ) p1 ++ ; 
        while ( p2 < R.size () && R[p2].fi >= x.fi ) 
        {
            add_bitline (p2,{R[p2].se,R[p2].se*(p2+1)}) ; 
            p2 ++ ; 
        }
        cnt ++ ; 
        chkmax (res,x.fi*x.se*(cnt+p1)) ; 

        int best = query (p1,cnt) ; 
        if ( best > 0 ) chkmax (res,x.fi*best) ; 
    }
}
void solve ( int l , int r ) 
{
    if ( l > r ) return ; 
    if ( l == r ) 
    {
        chkmax (res,a[l]*b[l]) ; 
        return ; 
    }
    int mid = (l+r)/2 ; 
    solve (l,mid) ; solve (mid+1,r) ; 
    vii L,R ; 
    int minA = INF , minB = INF ;
    for ( int i = mid + 1 ; i <= r ; i ++ ) 
    {
        chkmin (minA,a[i]) ; 
        chkmin (minB,b[i]) ; 
        R . pb({minA,minB}) ; 
    }
    minA = INF , minB = INF ; 
    for ( int i = mid ; i >= l ; i -- ) 
    {
        chkmin (minA,a[i]) ; 
        chkmin (minB,b[i]) ; 
        L . pb ({minA,minB}) ; 
    }
    calc (L,R) ; 
    calc (R,L) ; 
}
signed main () 
{
    ios_base::sync_with_stdio(0); 
    cin.tie(0);cout.tie(0); 
    rf () ;
    cin >> n ; 
    for ( int i = 1 ; i <= n ; i ++ ) cin >> a [i] >> b [i]; 
    res = 0 ; 
    solve (1,n) ; 
    cout << res ; 
    return 0;
}

Compilation message (stderr)

histogram.cpp: In function 'void rf()':
histogram.cpp:34:8: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   34 | freopen("bai1.inp","r",stdin);
      | ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
histogram.cpp:35:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 | freopen ("bai1.out","w",stdout) ;
      | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...