Cod sursa(job #137816)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 17 februarie 2008 15:00:23
Problema Stalpi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<stdio.h>
long int n,x[100000],c[100000],st[100000],dr[100000],v[100000],viz,i,Ct,j,sol;
 void heapdown(long int ii,long int nn);
 void swap(long int aa,long int bb);
 void cmin(long int xx);
int main()
{   FILE *f=fopen("stalpi.in","r"),
         *g=fopen("stalpi.out","w");
    fscanf(f,"%ld",&n);
    for(i=1;i<=n;i++)
     { fscanf(f,"%ld%ld%ld%ld",&x[i],&c[i],&st[i],&dr[i]); sol+=c[i];}
   // sortez dupa x
     for(i=n/2;i>=1;i--) heapdown(i,n);
     for(i=n;i>=1;i--){ swap(1,i);
                        heapdown(1,i-1);
                        }

    //sol x[i]
    cmin(1);
    //afisare sol
    fprintf(g,"%ld",sol);

    fcloseall();
    return 0;
}

void heapdown(long int ii, long int nn)
{    long int is, id;
     is=ii*2;
     id=ii*2+1;
     if(is>nn) return;
     if(nn%2==1) if(x[is]<x[id]) is=id;
     if(x[ii]<x[is]){ swap(is,ii);
                      heapdown(is,nn);
                      }
}
void swap(long int aa, long int bb)
{    long int aux;
     aux=x[aa]; x[aa]=x[bb]; x[bb]=aux;
     aux=c[aa]; c[aa]=c[bb]; c[bb]=aux;
     aux=st[aa]; st[aa]=st[bb]; st[bb]=aux;
     aux=dr[aa]; dr[aa]=dr[bb]; dr[bb]=aux;
}
void cmin(long int xx)
{
     if(xx<n)
     {
        //da
        Ct+=c[xx];  if(!v[xx]) viz++; v[xx]=xx;
        for(j=xx-1;x[j]>=x[xx]-st[xx]&&j>=1;j--)    //caut stanga
            if(!v[j]){ viz++; v[j]=xx;}
        for(j=xx+1;x[j]<=x[xx]+dr[xx]&&j<=n;j++)    //caut dreapta
           if(!v[j]){viz++; v[j]=xx;}
        if(viz==n) {if(sol>Ct) sol=Ct; }     //if solutie mai buna
        else cmin(xx+1);                     //apel urmatorul
         for(j=xx-1;x[j]>=xx-st[xx]&&j>=1;j--)  //sterg stanga
            if(v[j]==xx){ viz--; v[j]=0;}
        for(j=xx+1;x[j]<=xx+dr[xx]&&j<=n;j++)  //sterg dreapta
           if(v[j]==xx){viz--; v[j]=0;}
       Ct-=c[xx]; viz--; v[xx]=0;         //scad nodul
       //nu
        cmin(xx+1);                     //next nod
      }
}