Cod sursa(job #1151706)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 24 martie 2014 12:24:05
Problema Culori Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <iostream>
#include <fstream>
#include <algorithm>

#define DN 100005
#define LL long long
using namespace std;

ifstream f("pikachu.in");
ofstream g("pikachu.out");

struct stru{

    int ind,val;
};

int n,k,v[DN],mp[DN],poz,val,st,p[4*DN],ins,med;
LL arb[4*DN],S,rez = (1ll<<60);
stru c[DN];


void update(int nod,int left,int right){

    if(left == right){

        arb[nod] = val;
        p[nod] = ins;
        return;
    }
    int mij =(left+right)/2;
    if( poz <= mij ) update(2*nod,left,mij);
        else update(2*nod+1,mij+1,right);

    arb[nod] = arb[2*nod] + arb[2*nod+1];
    p[nod] = p[2*nod] + p[2*nod + 1];
}
void search(int nod,int left,int right){

    if(left == right){

        S+=arb[nod];
        med = arb[nod];
        return;
    }

    int mij =(left+right)/2;

    if( p[ 2*nod ] >= st ){

        search(2*nod,left,mij);
    }else{

        /// sar peste stanga
        st -= p[2*nod];
        S += arb[2*nod];
        search(2*nod+1,mij+1,right);
    }
}

bool cmp(stru a,stru b){

    return a.val < b.val;
}

void read(){

    f>>n>>k;
    for(int i=1;i<=n;++i){

        f>>v[i];
        c[i].ind = i;
        c[i].val = v[i];
    }
}

void init(){

    sort(c+1,c+n+1,cmp);
    for(int i=1;i<=n;++i)
        mp[ c[i].ind ] = i; /// pe a cata pozitie trebuie pus elementul cu indicele i in arb
}
void fnd(int x){

    st = x;
    S = 0;/// sum_left
    search(1,1,n);
    LL D = arb[1] - S;
    rez = min(rez , (x)*1ll*med - S + D - (k - x)*1ll*med );
}

void solve(){

    init();
    for(int i=1;i<k;++i){

        poz = mp[ i ];
        val = v[ i ];
        ins = 1;
        update(1,1,n);
    }
    for(int i=k;i<=n;++i){

        /// insert
        poz = mp[ i ];
        val = v[ i ];
        ins = 1;
        update(1,1,n);

        /// erase i-k
        if(i-k>=1){

            poz = mp[ i-k ];
            val = 0;
            ins = 0;
            update(1,1,n);
        }

        /// search
        fnd(k/2);
        fnd(k/2+1);
       // cout<<i-k+1<<" "<<k<<
    }
    g<<rez;
}

int main()
{
    read();
    solve();

    return 0;
}