Pagini recente » Cod sursa (job #1689179) | Cod sursa (job #1892572) | Cod sursa (job #760340) | Cod sursa (job #2396829) | Cod sursa (job #50420)
Cod sursa(job #50420)
#include <stdio.h>
#define FOR(i, a, b) for (i = (a); i <= (b); i++)
#define MaxN 100001
int N, S, root, brk;
int Sn[MaxN], Sf[MaxN], varsta[MaxN], sel[MaxN];
int q[MaxN];
struct NOD {
int vf;
NOD* next;
};
typedef NOD* PNOD;
PNOD L[MaxN];
void quick(int lf, int rt)
{
int i = lf - 1, j = rt + 1;
if (lf >= rt) return;
do
{
do { i++; } while (Sn[lf] < Sn[i]);
do { j--; } while (Sn[lf] > Sn[j]);
if (i < j)
{
int aux = Sn[i]; Sn[i] = Sn[j]; Sn[j] = aux;
}
} while (i < j);
quick(lf, j);
quick(j + 1, rt);
}
/*void df(int varf)
{
sel[varf] = 1;
int sum = varsta[varf], nrf = 0;
int* Sn = new int[MaxN];
Sn[++nrf] = sum;
for (PNOD p = L[varf]; p; p=p->next)
if (!sel[p->vf])
{
df(p->vf);
sum += Sf[p->vf];
Sn[++nrf] = Sf[p->vf];
}
quick(Sn, 1, nrf);
int f = 1;
while (sum > S) sum -= Sn[f], f++, brk++;
Sf[varf] = sum;
delete Sn;
}*/
void Add(int i, int j)
{
PNOD p = new NOD;
p->vf = j;
p->next =L[i];
L[i] = p;
}
void process(int varf)
{
int sum = varsta[varf], nrf = 0, f = 0;
PNOD p = L[varf];
Sn[++nrf] = sum;
while (p)
{
if (sel[p->vf]) continue;
sel[p->vf] = 1;
sum += Sf[p->vf];
Sn[++nrf] = Sf[p->vf];
p=p->next;
}
quick(1, nrf);
f = 1;
while (sum > S) sum -= Sn[f], f++, brk++;
Sf[varf] = sum;
}
int main()
{
int i, t, v;
FILE *fin = fopen("mese.in", "rt");
fscanf(fin, "%d %d", &N, &S);
FOR(i, 1, N)
{
fscanf(fin, "%d %d", &t, &varsta[i]);
if (t == 0) root = i;
else
Add(t, i);
}
fclose(fin);
//bf
int iq = 0, sq = 0;
q[sq] = root;
sel[root] = 1;
while (iq <= sq)
{
PNOD p = L[q[iq]];
while (p)
{
if (sel[p->vf]) continue;
sel[p->vf] = 1;
q[++sq] = p->vf;
p=p->next;
}
iq++;
}
FOR(i, 1, N) sel[i] = 0;
for (i = N-1; i >= 0; i--) process(q[i]);
//df(root);
FILE *fout = fopen("mese.out", "wt");
fprintf(fout, "%d", brk+1);
fclose(fout);
return 0;
}