线段树

http://unbelievable.ycool.com/post.718426.html
嘿嘿....今天自学线段树...

听那些家伙说.... 线段树是没有什么固定算法的.... 极具改造性...我狂FT....

反正.... 标程偶就拈在这里落:

Program IntervalTree;
Const Maxn=10000;
     Inf='Input.txt';
     Ouf='Output.txt';
Type TreeNode=Record
               a,b,Left,Right,Cover:Longint;
             End;
Var Tree:array [1..Maxn] of TreeNode;
   Number,Tot,c,d:Longint;

Procedure MakeTree(a,b:Longint);
Var Now:Longint;
Begin
 Inc(Tot);
 Now:=Tot;
 Tree[Now].a:=a; Tree[Now].b:=b; Tree[Now].Cover:=0;
 If a+1<b then begin
   Tree[Now].Left:=Tot+1;
   MakeTree(a,(a+b) div 2);
   Tree[Now].Right:=Tot+1;
   MakeTree((a+b) div 2,b);
 End;
End;

Procedure Insert(Num:Longint);
Begin
 If (c<=Tree[Num].a) and (Tree[Num].b<=d) then
   Tree[Num].Cover:=Tree[Num].Cover+1
 Else begin
   If c<(Tree[Num].a+Tree[Num].b) div 2 then Insert(Tree[Num].Left);
   If d>(Tree[Num].a+Tree[Num].b) div 2 then Insert(Tree[Num].Right);
 End;
End;

Procedure Delete(Num:Longint);
Begin
 If (c<=Tree[Num].a) and (Tree[Num].b<=d) then
   Dec(Tree[Num].Cover)
 Else begin
   If c<(Tree[Num].a+Tree[Num].b) div 2 then Delete(Tree[Num].Left);
   If d>(Tree[Num].a+Tree[Num].b) div 2 then Delete(Tree[Num].Right);
 End;
End;

Procedure Count(Num:longint);
Begin
 If Tree[Num].Cover>0 then
   Number:=Number+(Tree[Num].b-Tree[Num].a)
 Else begin
   If Tree[Num].Left>0 then Count(Tree[Num].Left);
   If Tree[Num].Right>0 then Count(Tree[Num].Right);
 End;
End;

Begin
 Assign(Input,Inf);Reset(Input);
 Assign(Output,ouf);Rewrite(Output);
 Readln(c,d);
 MakeTree(c,d);
 While not eof do Begin
   Readln(c,d);
   Insert(1);
 End;
 Count(1);
 Writeln(Number);
 Close(Output);
 Close(Input);
End.

posted @ 2008-12-05 15:28  jesonpeng  阅读(203)  评论(0)    收藏  举报