Cod sursa(job #1528769)

Utilizator tester_100Alin Barosanu tester_100 Data 20 noiembrie 2015 00:58:18
Problema Evaluarea unei expresii Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f

using namespace std;

const int nmax = 100005; const int kmax = 105;

int N,k,a[nmax],b[nmax],dp[nmax][2],aint[nmax][2];
stack<int> s;

inline void Precalc(){
 int i;

    for(i = N; i; --i){
            while(!s.empty() && a[i] > a[s.top()]){
                b[s.top()] = i;
                s.pop();
           }
        s.push(i);
    }
}

inline void Update(int nod,int st,int dr,int poz,int j,int val){

  if(st == dr && st == poz){

    aint[nod][j] = val;
    return;
  }

  int mij = (st + dr)/2;

    if(mij >= poz)
        Update(2*nod,st,mij,poz,j,val);
    else
        Update(2*nod+1,mij+1,dr,poz,j,val);

  aint[nod][j] = min(aint[2*nod][j],aint[2*nod+1][j]);
  //if(poz == 2 && j == 1 && val == 5) cout << nod <<' ';
}

inline int Query(int nod,int st,int dr,int l,int r,int j){


 if(st == l && dr == r){
        //if(l == 2 && r == 2 && j == 1) cout << nod <<' ';
    return aint[nod][j];
 }

 int mij = (st+dr)/2;

 if(mij < l)
    return Query(2*nod+1,mij+1,dr,l,r,j);
 else if(mij >= r)
    return Query(2*nod,st,mij,l,r,j);
 else{

    int x = Query(2*nod,st,mij,l,mij,j);
    int y = Query(2*nod+1,mij+1,dr,mij+1,r,j);


    return min(x,y);
 }
}
inline void Ksecv(){
 int i,j,sum,xi,u,p;

 memset(dp,INF,sizeof(dp));
 memset(aint,INF,sizeof(aint));

 dp[1][0] = p = a[1];
 u = 1;
    Update(1,1,N,1,0,a[1]);

  for(i = 2; i <= N; ++i,u^=1){
        p = max(p,a[i]);

    for(j = 1; j <= k; ++j){

         if(j > i)break;

    if(j == 1) {dp[i][u] = p;Update(1,1,N,1,u,p);continue;}

    xi = b[i];
     if(!b[i]) ++xi;

        sum = Query(1,1,N,xi,i-1,u^1);


                dp[i][u] = min(dp[b[i]][u],a[i]+sum);
             if(i == 3 && j == 2) cout << sum <<' ';
   // cout << i <<' '<<dp[i][u]<<'\n';
        Update(1,1,N,i,u,dp[i][u]);
       // if(i == 2 && j == 2) cout << dp[i][u];
  }
  }
}
int main(){
    int i;
    freopen ("ksecv.in","r",stdin);
    freopen ("ksecv.out","w",stdout);

    scanf("%d %d\n",&N,&k);
    for(i = 1; i <= N; ++i) scanf("%d ",&a[i]);

    Precalc();
    Ksecv();

    //printf("%d\n",dp[N][0]);
    return 0;
}