Cod sursa(job #30385)

Utilizator moga_florianFlorian MOGA moga_florian Data 13 martie 2007 21:00:06
Problema Reguli Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
using namespace std;
#include<fstream>
#include<stdio.h>
#define nmax 100002
#define qmax 34

struct nod{int vec,dist;nod* next;};
typedef nod* list;
list a[nmax],aux;

int n,q;
int x[nmax];
char viz[nmax];
int sum[nmax][qmax],nd[nmax][qmax];

int main()
{
//FILE *fin=fopen("caravane.in","r"),
//     *fout=fopen("caravane.out","w");

int i,j,k,cst;     
//fscanf(fin,"%d%d",&n,&q);
n=100000;
q=32;
for(i=1;i<n;i++)
  {
//  fscanf(fin,"%d%d%d",&j,&k,&cst);
  j=i;
  k=i+1;
  cst=100;
  
  if(a[j]==NULL)
     {
     a[j]=new nod;
     a[j]->next=NULL;     
     }
  else
     {
     aux=new nod;
     aux->next=a[j];
     a[j]=aux;                     
     }
  a[j]->vec=k;
  a[j]->dist=cst;
     
     
  if(a[k]==NULL)
     {
     a[k]=new nod;
     a[k]->next=NULL;           
     }
  else
     {
     aux=new nod;
     aux->next=a[k];
     a[k]=aux;                           
     }
  a[k]->vec=j;
  a[k]->dist=cst;
  }
  
//BFS
memset(viz,0,sizeof viz);
int li,lf;
li=lf=1;
x[li]=1;
viz[1]=1;

while(li<=lf)
  {
  for(aux=a[x[li]];aux;aux=aux->next)
     if(viz[aux->vec]==0)
        {
        viz[aux->vec]=1;
        x[++lf]=aux->vec;                        
        }           
  li++;
  }

//completare matrice
memset(sum,0,sizeof sum);
memset(nd,0,sizeof nd);
for(i=1;i<=n;i++)
  nd[i][0]=1;
  
for(i=lf;i;i--)
  {
  viz[x[i]]=0;
  
  for(aux=a[x[i]];aux;aux=aux->next)
     if(viz[aux->vec]==0)
        for(j=0;j<q;j++)
           {
           sum[x[i]][j+1]+=sum[aux->vec][j] + nd[aux->vec][j]*aux->dist;
           nd[x[i]][j+1]+=nd[aux->vec][j];
           }          
  }
  
//solutia
long long sol=0,sol2=0,s1,s2;

for(i=1;i<=n;i++)
   {
   viz[x[i]]=1;
   for(aux=a[x[i]];aux;aux=aux->next)
    if(viz[aux->vec]==0)
     for(j=1;j<q;j++)
         {
         s1= (long long) sum[aux->vec][j-1] + nd[aux->vec][j-1]*aux->dist;
         s2= (long long) sum[aux->vec][q-j-1] + nd[aux->vec][q-j-1]*aux->dist;
         s2= (long long) sum[x[i]][q-j] - s2;
         sol+= s1 * (nd[x[i]][q-j]-nd[aux->vec][q-j-1]) +s2;
         }
   sol2+=(long long)sum[x[i]][q];           
   }
   
sol+=sol2<<1;
  
//fprintf(fout,"%lld\n",sol);

//fclose(fin);
//fclose(fout);
return 0;
}