Cod sursa(job #2657922)

Utilizator Vaida_Radu_AndreiVaida Radu Andrei Vaida_Radu_Andrei Data 12 octombrie 2020 18:02:19
Problema Deque Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.25 kb
#include <cstdio>
#include <algorithm>
#define maxN 5120000

using namespace std;

struct Nrs {
    long long int value,pos;
}v[maxN];

long long int n,k,filled[maxN],filledNr,p2;

void read() {
    Nrs NewNr;
    scanf("%lld%lld",&n,&k);
    for(NewNr.pos=0;NewNr.pos<n;++NewNr.pos) {
        scanf("%lld",&NewNr.value);
        v[NewNr.pos]=NewNr;
    }
}

bool cmp(Nrs X,Nrs Y) {
    return X.value<Y.value;
}

void fixBinSrch() {
    for(p2=1;p2<=(k+k-1);p2<<=1);
    p2>>=1;
}

void binSrch(int fst,int lst,int&start,int&stop) {
    if(fst<k-1) {
        fst=k-1;
    }
    if(lst>=n) {
        lst=n;
    }
    if(filled[fst]==1) {
        if(filled[lst-1]==1) {
            int i;
            for(start=-1,i=fst;i<lst;++i) {
                if(!filled[i]) {
                    start=i;
                    break;
                }
            }
            for(stop=-1;i<lst;++i) {
                if(filled[i]) {
                    stop=i;
                    break;
                }
            }
            if(stop==-1) {
                start=0;
                stop=0;
            }
        }
        else {
            int i,p;
            for(i=fst,p=p2;p;p>>=1) {
                if(i+p<n&&filled[i+p]) {
                    i+=p;
                }
            }
            start=i+1;
            stop=lst;
        }
    }
    else {
        if(filled[lst]==1) {
            int i,p;
            for(i=fst,p=p2;p;p>>=1) {
                if(i+p<n&&!filled[i+p]) {
                    i+=p;
                }
                start=fst;
                stop=i+1;
            }
        }
        else {
            start = fst;
            stop = lst;
        }
    }
}

int fill(int xpos) {
    int i,start,stop;
    binSrch(xpos,xpos+k,start,stop);
    for(i=start;i<stop;++i) {
        filled[i]=1;
    }
    if(stop-start>0) {
        return stop-start;
    }
    else {
        return 0;
    }
}

void solve() {
    long long int sol,i,newfiledNr;
    fixBinSrch();
    for(i=0,sol=0,filledNr=0;filledNr<n-k+1;sol+=newfiledNr*v[i].value,filledNr+=newfiledNr,++i) {
        newfiledNr=fill(v[i].pos);
    }
    printf("%lld",sol);
}

int main() {
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);
    read();
    sort(v,v+n,cmp);
    solve();
    return 0;
}