切换到宽版
  • 4338阅读
  • 2回复

SBT我的程序 [复制链接]

上一主题 下一主题
离线zhuojingwei
 
只看楼主 倒序阅读 0 发表于: 2008-02-12
  1. program lt;
  2. var n,m,num,p,i,k,code,head:longint;
  3.     key,left,right,s:array[1..100000] of longint;
  4.     ss:string;
  5. procedure left_rotate(var x:longint);
  6. var y:longint;
  7. begin
  8.   y:=right[x];
  9.   right[x]:=left[y];
  10.   left[y]:=x;
  11.   s[y]:=s[x];
  12.   s[x]:=s[left[x]]+s[right[x]]+1;
  13.   x:=y;
  14. end;
  15. procedure right_rotate(var x:longint);
  16. var y:longint;
  17. begin
  18.   y:=left[x];
  19.   left[x]:=right[y];
  20.   right[y]:=x;
  21.   s[y]:=s[x];
  22.   s[x]:=s[left[x]]+s[right[x]]+1;
  23.   x:=y;
  24. end;
  25. procedure maintain(var t:longint;flag:boolean);
  26. begin
  27.   if flag then
  28.     if s[right[right[t]]]>s[left[t]] then
  29.           left_rotate(t)
  30.     else
  31.     if s[left[right[t]]]>s[left[t]] then
  32.     begin
  33.       right_rotate(right[t]);
  34.       left_rotate(t);
  35.     end
  36.     else exit
  37.   else
  38.     if s[left[left[t]]]>s[right[t]] then
  39.           right_rotate(t)
  40.     else
  41.     if s[right[left[t]]]>s[right[t]] then
  42.     begin
  43.       left_rotate(left[t]);
  44.       right_rotate(t);
  45.     end
  46.     else exit;
  47.   maintain(left[t],false);
  48.   maintain(right[t],true);
  49.   maintain(t,false);
  50.   maintain(t,true);
  51. end;
  52. procedure insert(k:longint;var t:longint);
  53. begin
  54.   if t=0 then
  55.   begin
  56.     inc(num);
  57.     t:=num;
  58.     s[t]:=1;
  59.     left[t]:=0;right[t]:=0;
  60.     key[t]:=k;
  61.   end
  62.   else
  63.   begin
  64.     inc(s[t]);
  65.     if k<key[t] then insert(k,left[t]) else insert(k,right[t]);
  66.     maintain(t,k>=key[t]);
  67.   end;
  68. end;
  69. function delete(k:longint;var t:longint):longint;
  70. begin
  71.   dec(s[t]);
  72.   if (k=key[t])or(k<key[t])and(left[t]=0)or(k>key[t])and(right[t]=0) then
  73.   begin
  74.     delete:=key[t];
  75.     if (left[t]=0) or (right[t]=0) then t:=left[t]+right[t]
  76.     else key[t]:=delete(k+1,left[t]);
  77.   end
  78.   else
  79.   if k<key[t] then delete:=delete(k,left[t])
  80.   else delete:=delete(k,right[t]);
  81. end;
  82. procedure select(k:longint;var t:longint);
  83. begin
  84.   if k=s[left[t]]+1 then
  85.   begin
  86.     writeln(key[t]);
  87.     p:=delete(key[t],head);
  88.   end
  89.   else if k<=s[left[t]] then select(k,left[t])
  90.   else select(k-1-s[left[t]],right[t]);
  91. end;
  92. begin
  93.   assign(input,'arr.in');
  94.   assign(output,'arr.out');
  95.   reset(input);
  96.   rewrite(output);
  97.   readln(n,m);
  98.   head:=0;
  99.   for i:=1 to m do
  100.   begin
  101.     readln(ss);
  102.     val(copy(ss,3,length(ss)-2),k,code);
  103.     if ss[1]='i' then insert(k,head)
  104.     else select(k,head);
  105.   end;
  106.   close(input);
  107.   close(output);
  108. end.
离线zhuojingwei
只看该作者 1 发表于: 2008-02-13
难道说没人知道SBT吗
离线zhuojingwei
只看该作者 2 发表于: 2008-03-02
人工再来一下
快速回复
限100 字节
 
上一个 下一个