Cod sursa(job #1410943)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 31 martie 2015 12:48:22
Problema Ghiozdan Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include<cstdio>
#include<deque>
#define INF 2000000000
using namespace std;
deque<int>q;
int n,m,nr,a,b,k,i,j,v[20500],x[250],d[2][76000],t[2][76000];
FILE *f,*g;
void rez(int sst,int ddr,int m){
    int st=sst;
    int dr=ddr;
    while(x[st]==0&&st<=dr)
        st++;
    while(x[dr]==0&&dr>=st)
        dr--;
    if(m==0)
        return;
    if(st==dr){
        i=1;
        int s=0;
        while(s<=m&&i<=x[st]){
            s+=st;
            i++;
            fprintf(g,"%d\n",st);
        }
        return;
    }
    nr=0;
    for(i=st;i<=dr;i++){
        t[0][i]=i;
        if( i%st || i/st>x[st] )
            d[0][i]=INF;
        else
            d[0][i]=i/st;
    }
    int mid=(st+dr)/2;
    for(i=0;i<=m;i++){
        d[1][i]=INF;
        if(!d[0][i])
            d[0][i]=INF;
    }
    for(i=st;i<=dr;i++){
        if(x[i]){
            for(k=0;k<i;k++){
                q.clear();
                for(j=k;j<=m;j+=i){
                    while(!q.empty()&&d[1][j]<=d[0][ q.front() ]){
                        q.pop_back();
                    }
                    if(d[0][j]!=INF)
                        q.push_back(j);
                    while( (j-q.front())/i >= x[i] && !q.empty() ){
                        q.pop_front();
                    }
                    if(!q.empty()){
                        a=d[0][ q.front() ] + (j-q.front())/i;
                        if(a<d[1][j]){
                            d[1][j]=a;
                            if(j<=mid)
                                t[1][j]=j;
                            else
                                t[1][j]=t[0][ q.front() ];
                        }
                    }
                }
            }
            for(k=0;k<=m;k++){
                d[0][k]=d[1][k];
                d[1][k]=INF;
                t[0][k]=t[1][k];
                t[1][k]=INF;
            }
        }
    }
    for(nr=m;nr>=1;nr--){
        if(d[0][nr]!=INF)
            break;
    }
    if(sst==1&&ddr==200)
        fprintf(g,"%d %d\n",nr,d[0][nr]);
    nr=t[0][nr];
    rez(st,mid,nr);
    rez(mid+1,dr,m-nr);
}
int main(){
    f=fopen("ghiozdan.in","r");
    g=fopen("ghiozdan.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&v[i]);
        x[ v[i] ]++;
    }
    rez(1,200,m);



    fclose(f);
    fclose(g);
    return 0;
}