SPLAY

program splay_tree;
var     i,j,k,x,root,totnode,l,r,n:longint;
        father,count,data:array[0..100]of longint;
        sons:array[0..100,1..2]of longint;
        st:longint;
procedure rotate(x,w:longint);
var     y,z:longint;
begin
        y:=father[x];
        z:=count[y];
        count[y]:=count[y]-count[x]+count[sons[x,w]];
        count[x]:=z;
        sons[y,3-w]:=sons[x,w];
        if sons[x,w]<>0 then
         father[sons[x,w]]:=y;
        father[x]:=father[y];
        if father[y]<>0 then
         if y=sons[father[y],1] then sons[father[y],1]:=x else
          sons[father[y],2]:=x;
        father[y]:=x;
        sons[x,w]:=y;
end;
procedure splay(x,y:longint);
var     p,q:longint;
begin
        while father[x]<>0 do
        begin
         if father[father[x]]=y then
          if x=sons[father[x],1] then rotate(x,2) else rotate(x,1)
         else
         begin
          if father[x]=sons[father[father[x]],1] then q:=1 else q:=2;
          if x=sons[father[x],1] then p:=1 else p:=2;
          if p=q then
           begin rotate(father[x],3-q);rotate(x,3-p);end
          else
           begin rotate(x,3-p);rotate(x,3-q);end
         end;
        end;
        if y=0 then root:=x;
end;
procedure insert(v:longint);
var     x:longint;
begin
        x:=root;
        while x<>0 do
        begin
         count[x]:=count[x]+1;
         if v<data[x] then if sons[x,1]=0 then break else x:=sons[x,1]
                      else if sons[x,2]=0 then break else x:=sons[x,2];
        end;
        inc(totnode);
        data[totnode]:=v;
        father[totnode]:=x;
        count[totnode]:=1;
        if v<data[x] then sons[x,1]:=totnode else sons[x,2]:=totnode;
        splay(totnode,0);
end;
procedure delete(x:longint);
var     y:longint;
begin
        splay(x,0);
        if sons[x,1]=0 then
        begin
         root:=sons[x,2];
         father[sons[x,2]]:=0;
        end
        else
        begin
         y:=sons[x,1];
         while sons[y,2]<>0 do
          y:=sons[y,2];
         splay(y,sons[x,1]);
         root:=y;
         father[y]:=0;
         sons[y,2]:=sons[x,2];
         count[y]:=count[y]+count[sons[x,2]];
         if sons[x,2]<>0 then father[sons[x,2]]:=y;
        end;
end;
function find(v:longint):longint;
var     x:longint;
begin
        x:=root;
        while x<>0 do
         if v<data[x] then
          x:=sons[x,1]
         else
          if v>data[x] then
           x:=sons[x,2]
          else
           break;
        splay(x,0);
end;
function rank(v:longint):longint;
var     x:longint;
begin
        x:=find(v);
        splay(x,0);
        rank:=count[sons[x,1]]+1;
end;
function get(v:longint):longint;
var     x:longint;
begin
        x:=root;
        while v<>count[sons[x,1]]+1 do
        if v<=count[sons[x,1]] then x:=sons[x,1]
         else
         begin
          v:=v-count[sons[x,1]]-1;
          x:=sons[x,2];
         end;
        splay(x,0);
        get:=count[sons[x,1]]+1;
end;
procedure deleteline(l,r:longint);
var       x,y,z:longint;
begin
        splay(l,0);
        y:=sons[l,1];
        while sons[y,2]<>0 do
         y:=sons[y,2];
        splay(r,0);
        z:=sons[r,2];
        while sons[z,1]<>0 do
         z:=sons[z,1];
        splay(y,0);
        splay(z,y);
        count[z]:=count[z]-count[sons[z,1]];
        count[y]:=count[y]-count[sons[z,1]];
        sons[z,1]:=0;
end;
begin
        assign(input,'splay.in');
        reset(input);
        readln(n);
        for i:=1 to n do
        begin
         readln(st);
         case st of
          1:begin readln(x);insert(x);end;
          2:begin readln(x);delete(find(x));end;
          3:begin readln(x);writeln(rank(x));end;
          4:begin readln(x);writeln(get(x));end;
          5:begin readln(l,r);deleteline(l,r);end;
         end;
        end;
        close(input);
end.       

各種過程的解釋:

1.ROTATE(X,W) 表示將X節點左旋或者右旋,w=1時左旋,w=2時右旋。

2.SPLAY(X)         表示將X節點進行伸展。

3.INSERT(X)       表示插入一個值爲X的節點。

4.DELETE(X)      表示刪除X節點。

5.FIND(X)            表示找到值爲X的點。

6.RANK(X)          表示X的排名。

7.GET(X)             表示找到第X小數。

8.DELETELINE(X)表示刪除標號在L,R內的所有數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章