Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

求高手查错!谢谢!线段树

Posted by xycking at 2010-01-26 21:26:15 on Problem 3468
求高手查错!pku3468

可恶,不管我怎么测,都对,可一交就错

program dsjfbs;
type
  treetype=record
    lf,rf,left,right,parent,ad:longint;{线段树;lf是左边,rf是右边,left,right左右儿子,此树较特殊,中间有一个数,ad是更改量}
    sum:int64;
  end;
var
  tree:array[0..100000]of treetype;
  a:array[1..100000]of longint;
  l,len,n,q,i,j,k,m:longint;
  s:int64;
  x:char;

procedure add(b,e,p:longint);{添加}
var
key,keyt,ll,rr,lll,rrr,tmp:longint;
begin
  key:=(tree[p].lf+tree[p].rf)div 2;
  if tree[p].ad<>0 then begin{标记下放}
  a[key]:=a[key]+tree[p].ad;
  if tree[p].left<>0 then tree[tree[p].left].ad:=tree[tree[p].left].ad+tree[p].ad;
  if tree[p].right<>0 then tree[tree[p].right].ad:=tree[tree[p].right].ad+tree[p].ad;
  tree[p].sum:=tree[p].sum+tree[p].ad*(tree[p].rf-tree[p].lf+1);
  tree[p].ad:=0;
  end;
  if (b=tree[p].lf)and(e=tree[p].rf) then begin
    tree[p].ad:=tree[p].ad+k;
  end
  else begin
  tree[p].sum:=tree[p].sum+k*(e-b+1);
  if (b<=key)and(e>=key) then begin{判断比较麻烦}
    a[key]:=a[key]+k;
      if (b=key)and(e>key) then add(key+1,e,tree[p].right)
      else if (e=key)and(b<key) then add(b,key-1,tree[p].left)
      else if (b<key) then begin
        add(b,key-1,tree[p].left);
        add(key+1,e,tree[p].right);
      end;
  end;
  if b>key then add(b,e,tree[p].right);
  if e<key then add(b,e,tree[p].left);
  end;
end;
procedure fsum(b,e,p:longint);{查找}
var
key,keyt,tmp:longint;
begin
  key:=(tree[p].lf+tree[p].rf)div 2;
  if tree[p].ad<>0 then begin{标记下放}

    a[key]:=a[key]+tree[p].ad;
    if tree[p].left<>0 then tree[tree[p].left].ad:=tree[tree[p].left].ad+tree[p].ad;
    if tree[p].right<>0 then tree[tree[p].right].ad:=tree[tree[p].right].ad+tree[p].ad;
    tree[p].sum:=tree[p].sum+tree[p].ad*(tree[p].rf-tree[p].lf+1);
    tree[p].ad:=0;
  end;
  if (b=tree[p].lf)and(e=tree[p].rf) then s:=s+tree[p].sum+tree[p].ad*(tree[p].rf-tree[p].lf+1)
  else begin
    if (b<=key)and(e>=key) then begin
      s:=s+a[key];
      if (b=key)and(e>key) then fsum(key+1,e,tree[p].right)
      else if (e=key)and(b<key) then fsum(b,key-1,tree[p].left)
      else if b<e then begin
        fsum(b,key-1,tree[p].left);
        fsum(key+1,e,tree[p].right);
      end;
    end;
    if b>key then fsum(b,e,tree[p].right);
    if e<key then fsum(b,e,tree[p].left);
  end;
end;
begin
  assign(input,'pku_3468.in');
  assign(output,'pku_3468.out');
  reset(input);
  rewrite(output);
  readln(n,q);
  for i:=1 to n do read(a[i]);
  readln;
  build(1,n,0,0);
  len:=0;
  tree[0].left:=0;
  for i:=1 to q do begin
    read(x);
    if x='C' then begin
      readln(m,l,k);
      add(m,l,1);
    end
    else begin
      s:=0;
      read(m);
      readln(l);
      fsum(m,l,1);
      writeln(s);
    end;
  end;
 close(input);
 close(output);
end.








Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator