【CF500D】New Year Santa Network(树上统计)

 1 var head,vet,next,x,y,dep,size:array[1..200000]of longint;
 2     z:array[1..200000]of extended;
 3     n,i,m,tot,x1:longint;
 4     ans,fenmu,y1:extended;
 5 
 6 procedure add(a,b:longint);
 7 begin
 8  inc(tot);
 9  next[tot]:=head[a];
10  vet[tot]:=b;
11  head[a]:=tot;
12 end;
13 
14 procedure dfs(u,fa:longint);
15 var e,v:longint;
16 begin
17  size[u]:=1;
18  e:=head[u];
19  while e<>0 do
20  begin
21   v:=vet[e];
22   if v<>fa then
23   begin
24    dep[v]:=dep[u]+1;
25    dfs(v,u);
26    size[u]:=size[u]+size[v];
27   end;
28   e:=next[e];
29  end;
30 end;
31 
32 procedure swap(var x,y:longint);
33 var t:longint;
34 begin
35  t:=x; x:=y; y:=t;
36 end;
37 
38 function clac(k:longint):extended;
39 var xx,yy:extended;
40 begin
41  xx:=size[y[k]];
42  yy:=n-xx;
43  exit(2.0*z[k]/fenmu*(xx*(xx-1)/2*yy+yy*(yy-1)/2*xx));
44 end;
45 
46 begin
47  //assign(input,'1.in'); reset(input);
48  //assign(output,'1.out'); rewrite(output);
49  readln(n);
50  for i:=1 to n-1 do
51  begin
52   read(x[i],y[i],z[i]);
53   add(x[i],y[i]);
54   add(y[i],x[i]);
55  end;
56  dfs(1,0);
57  for i:=1 to n-1 do
58   if dep[x[i]]>dep[y[i]] then swap(x[i],y[i]);
59  fenmu:=1.0*n*(n-1)*(n-2)/6;
60  for i:=1 to n-1 do ans:=ans+clac(i);
61 
62 
63  readln(m);
64  for i:=1 to m do
65  begin
66   readln(x1,y1);
67   ans:=ans-clac(x1);
68   z[x1]:=y1;
69   ans:=ans+clac(x1);
70   writeln(ans:0:10);
71  end;
72 
73  //close(input);
74  //close(output);
75 end.
View Code

 

posted on 2015-12-09 20:25  myx12345  阅读(210)  评论(0编辑  收藏  举报

导航