线段树
嘿嘿....今天自学线段树...
听那些家伙说.... 线段树是没有什么固定算法的.... 极具改造性...我狂FT....![]()
反正.... 标程偶就拈在这里落:
听那些家伙说.... 线段树是没有什么固定算法的.... 极具改造性...我狂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. |

浙公网安备 33010602011771号