2017.3.18 2014年初中竞赛试题(南海) 树

这里写图片描述
这里写图片描述

分析:
对于改变,用一个数组记录改变值,求值时,从当前点往根节点走,遇到一个点看该点到求值的点的距离的奇偶,对应加减即可,距离可以每上一层就加1,要先预处理出每个点的父亲即可。

代码:

var
  n,m,i,x,y,s,j,d:longint;
  f,t,w,b,e:array[1..100000] of longint;
  v:array[1..100000] of boolean;
  a:array[0..200000,1..2] of longint;

procedure qsort(l,r:longint);
var
  i,j,k:longint;
begin
  if l>=r then exit;
  i:=l;
  j:=r;
  k:=a[(i+j) div 2,1];
  repeat
    while a[i,1]<k do inc(i);
    while a[j,1]>k do dec(j);
    if i<=j then
    begin
      a[0]:=a[i];a[i]:=a[j];a[j]:=a[0];
      inc(i);dec(j);
    end;
  until i>j;
  qsort(i,r);
  qsort(l,j);
end;

procedure dfs(x:longint);
var
  i:longint;
begin
  v[x]:=false;
  for i:=b[x] to e[x] do
    if v[a[i,2]] then
    begin
      f[a[i,2]]:=x;
      dfs(a[i,2]);
    end;
end;

begin
  readln(n,m);
  for i:=1 to n do
    read(w[i]);
  readln;
  for i:=1 to n-1 do
  begin
    readln(x,y);
    a[i*2-1,1]:=x;
    a[i*2-1,2]:=y;
    a[i*2,1]:=y;
    a[i*2,2]:=x;
  end;
  qsort(1,n*2-2);
  a[0,1]:=0;
  for i:=1 to n*2-2 do
  begin
    if a[i,1]<>a[i-1,1] then b[a[i,1]]:=i;
    if a[i,1]<>a[i+1,1] then e[a[i,1]]:=i;
  end;
  fillchar(v,sizeof(v),true);
  dfs(1);
  for i:=1 to m do
  begin
    read(x);
    if x=1
      then begin
             readln(x,y);
             t[x]:=t[x]+y;
           end
      else begin
             readln(x);
             s:=w[x];
             j:=x;
             d:=0;
             while j>0 do
             begin
               d:=1-d;
               if d=0
                 then s:=s-t[j]
                 else s:=s+t[j];
               j:=f[j];
             end;
             writeln(s);
           end;
  end;
end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值