0w1

AOJ 2431 House Moving ( DP + Segment Tree )

House Moving | Aizu Online Judge
JOI 11 Day4 Bookshelf ( DP + Segment Tree ) - 0w1
とほぼ同じ。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
#define int long long

struct itvt{
    int maxv;
    int lb, rb;
    itvt *lc, *rc;
    itvt(int _l = 0, int _r = 0): maxv(0), lb(_l), rb(_r), lc(NULL), rc(NULL){}
    void pull(){
        maxv = max( lc->maxv, rc->maxv );
    }
    void update(int k, int v){
        if( lb == rb ){
            maxv = v;
            return;
        }
        int mid = lb + rb >> 1;
        if( k <= mid ) lc->update( k, v );
        else rc->update( k, v );
        pull();
    }
    int qmax(int ql, int qr){
        if( qr < lb || rb < ql ) return 0;
        if( ql <= lb && rb <= qr ) return maxv;
        int res = 0;
        res = max( res, lc->qmax( ql, qr ) );
        res = max( res, rc->qmax( ql, qr ) );
        return res;
    }
};

itvt* buildItvt(int lb, int rb){
    itvt *t = new itvt( lb, rb );
    if( lb == rb ) return t;
    int mid = lb + rb >> 1;
    t->lc = buildItvt( lb, mid );
    t->rc = buildItvt( mid + 1, rb );
    return t;
}

int n;
int x[ MAXN ];

void solve(){
    itvt *root = buildItvt( 1, n );
    int sum = 0, maxnmv = 0;
    for(int i = 1; i <= n; ++i){
        sum += x[ i ];
        int nmv = root->qmax( 1, x[ i ] - 1 ) + x[ i ];
        maxnmv = max( maxnmv, nmv );
        root->update( x[ i ], nmv );
    }
    cout << sum - maxnmv << endl;
}

signed main(){
    cin >> n;
    for(int i = 1; i <= n; ++i)
        cin >> x[ i ];
    solve();
    return 0;
}