Pagini recente » Cod sursa (job #732023) | Cod sursa (job #894938) | Rating Tascu Stelian-Andrei (tascustelian) | Cod sursa (job #2128056) | Cod sursa (job #137816)
Cod sursa(job #137816)
#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
}
}