Cod sursa(job #478936)

Utilizator freak93Adrian Budau freak93 Data 21 august 2010 11:31:59
Problema Dosare Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include<fstream>
#include<algorithm>
#include<vector>
#define x first
#define y second

using namespace std;

const char iname[]="dosare.in";
const char oname[]="dosare.out";
const int maxn=16007;

ifstream f(iname);
ofstream g(oname);

pair<long long,long long> a[maxn];
vector<int> E[maxn];
int n,i,x;

bool fcomp(int x,int y)
{
    if(a[x].x!=a[y].x)
        return a[x].x>a[y].x;
    return a[x].y>a[y].y;
}

void go(int x)
{
    a[x].y+=a[x].x;
    if(E[x].size()==0)
        return;
    for(vector<int>::iterator it=E[x].begin();it!=E[x].end();++it)
        go(*it);
    sort(E[x].begin(),E[x].end(),fcomp);
    for(int i=0;i<(int)E[x].size();++i)
        a[x].y+=(i+1)*a[E[x][i]].x+a[E[x][i]].y,a[x].x+=a[E[x][i]].x;
}

int main()
{
    f>>n;
    for(i=2;i<=n;++i)
        f>>x,E[x].push_back(i);
    for(i=1;i<=n;++i)
        f>>a[i].x;
    go(1);
    g<<a[1].y<<"\n";
}