Cod sursa(job #842131)

Utilizator stoicatheoFlirk Navok stoicatheo Data 26 decembrie 2012 11:47:18
Problema Mese Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<stdio.h>
#include<algorithm>
#define N 100010
using namespace std;
struct Nod{int inf;Nod *urm;};
Nod *s[N];
int t,n,V,i,v[N],m[N],cv[N],root;
void read(),solve(),DF(int nod,int p);

int main()
{
    read();
    solve();
    return 0;
}
void read()
{
    Nod *q;
    freopen("mese.in","r",stdin);
    freopen("mese.out","w",stdout);
    scanf("%d%d",&n,&V);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&t,&v[i]);
        if(t){q=new Nod;q->inf=i;q->urm=s[t];s[t]=q;}
        else root=i;
    }
}
void solve()
{
    DF(root,1);
    printf("%d\n",m[root]+1);
}
void DF(int nod,int p)
{
    int top=p-1;Nod *q;
    for(q=s[nod];q;q=q->urm)
    {
        DF(q->inf,top+1);
        v[nod]+=v[q->inf];
        m[nod]+=m[q->inf];
        cv[++top]=v[q->inf];
    }
    if(top>=p)
    {
        sort(cv+p,cv+top+1);
        while(v[nod]>V&&top>=p){v[nod]-=cv[top--];m[nod]++;}
    }
}