Cod sursa(job #1176067)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 25 aprilie 2014 15:39:17
Problema Deque Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>

using namespace std;

char buffer[5000000*10];
struct deq
{
    int min,pos;
} v[1000000];
int main()
{
    freopen("deque.in","r",stdin);
    freopen("deque.out","w",stdout);
    int n,k,i,r,u,j=0,minim=10000000,vf=0,semn,vf1=0;
    long long sol=0;
    scanf("%d %d\n",&n,&k);
    v[vf1].min=minim;v[vf1].pos=0;
    fread(buffer,10,5000000*10,stdin);
    for(i=0;i<k;i++)
    {   r=0;
        semn=1;
        while(buffer[j]!='\n')
        {   if(buffer[j]=='-') semn=-1,j++;
            r=r*10+buffer[j]-'0';
            j++;
        }
        if(semn==-1) r=-r;
        j++;
        for(u=vf1;u>=vf;u--)
        {
            if(r<v[u].min&&u<vf1) v[u].min=r,v[u].pos=i,vf1=u;
            else if(r<v[u].min&&u==vf1) v[vf1].min=r,v[u].pos=i;
        }
        if(v[vf1].min!=r) v[++vf1].min=r,v[vf1].pos=i;
    }
    sol=v[vf].min;
    for(;i<n;i++)
    {
        r=0;
        semn=1;
        while(buffer[j]!='\n')
        {   if(buffer[j]=='-') semn=-1,j++;
            r=r*10+buffer[j]-'0';
            j++;
        }
        if(semn==-1) r=-r;
        j++;
        for(u=vf;u<=vf1;u++) {if(v[u].pos<=i-k) vf++;else break;}
        for(u=vf1;u>=vf;u--)
        {
            if(r<v[u].min&&u<vf1) v[u].min=r,v[u].pos=i,vf1=u;
            else if(r<v[u].min&&u==vf1) v[vf1].min=r,v[u].pos=i;
        }
        if(v[vf1].min!=r) v[++vf1].min=r,v[vf1].pos=i;
        sol+=v[vf].min;
    }
    printf("%lld",sol);
}