原题:ZJOI2008 count
方法:块状树
program count_trees;{$M 9999999}
const maxn=30000+20;
type
link=^node; node=record x:longint; next:link; end;
var
own,w,dep,sum,size,fa,mun:array[0..maxn]of longint;
ge,g:array[1..maxn]of link; limit:longint;
procedure update(var x:longint; const y:longint);
begin
if y>x then x:=y;
end;
procedure push(var x:link; const t:longint);var p:link;
begin
new(p);p^.x:=t;p^.next:=x;x:=p;
end;
procedure build(const x,f,d:longint);
var p:link;tmp:longint;
begin
fa[x]:=f; dep[x]:=d; tmp:=own[x];
p:=ge[x];while p<>nil do begin
if p^.x<>f then begin
if size[tmp]<limit then begin
inc(size[tmp]);own[p^.x]:=tmp;
push(g[x],p^.x);
end;build(p^.x,x,d+1);end;
p:=p^.next;
end;
end;
procedure dfs(x,s,m:longint);var p:link;
begin
inc(s,w[x]);sum[x]