pku3418 Double Queue

來源:互聯網
上載者:User

需要這樣一個資料結構,支援如下操作

1:插入優先順序為p,編號為k的節點

2:查詢優先順序最高的節點,輸出編號並刪除

3:查詢優先順序最低的節點,輸出編號並刪除

用一顆SBT即可完美解決問題,沒什麼好說的,多說無益~~~

View Code

  1 program pku3481(input,output);  2 var  3     left,right,key,s,th:array[0..200000] of longint;  4     tot,root:longint;  5 procedure left_rotate(var t:longint);  6 var  7     k:longint;  8 begin  9     k:=right[t]; 10     right[t]:=left[k]; 11     left[k]:=t; 12     s[k]:=s[t]; 13     s[t]:=s[left[t]]+s[right[t]]+1; 14     t:=k; 15 end;{ left_rotate } 16 procedure right_rotate(var t:longint); 17 var 18     k:longint; 19 begin 20     k:=left[t]; 21     left[t]:=right[k]; 22     right[k]:=t; 23     s[k]:=s[t]; 24     s[t]:=s[left[t]]+s[right[t]]+1; 25     t:=k; 26 end;{ right_rotate } 27 procedure maintain(var t:longint;flag:boolean); 28 begin 29     if not flag then 30     begin 31         if s[left[left[t]]]>s[right[t]] then 32             right_rotate(t) 33         else 34             if s[right[left[t]]]>s[right[t]] then 35             begin 36                 left_rotate(left[t]); 37                 right_rotate(t); 38             end 39             else 40                 exit; 41     end 42     else 43     begin 44         if s[right[right[t]]]>s[left[t]] then 45             left_rotate(t) 46         else 47             if s[left[right[t]]]>s[left[t]] then 48             begin 49                 right_rotate(right[t]); 50                 left_rotate(t); 51             end 52             else 53                 exit; 54     end; 55     maintain(left[t],false); 56     maintain(right[t],true); 57     maintain(t,false); 58     maintain(t,true); 59 end;{ maintain } 60 procedure insert(var now,k,u:longint); 61 begin 62     if now=0 then 63     begin 64         inc(tot); 65         now:=tot; 66         s[now]:=1; 67         left[now]:=0; 68         right[now]:=0; 69         key[now]:=k; 70         th[now]:=u; 71     end 72     else 73     begin 74         inc(s[now]); 75         if k<key[now] then 76             insert(left[now],k,u) 77         else 78             insert(right[now],k,u); 79         maintain(now,k>=key[now]); 80     end; 81 end;{ insert } 82 function delete(var t:longint;k:longint):longint; 83 begin 84     dec(s[t]); 85     if (k=key[t])or((k<key[t])and(left[t]=0))or((k>key[t])and(right[t]=0)) then 86     begin 87         delete:=key[t]; 88         if left[t]*right[t]=0 then 89             t:=left[t]+right[t] 90         else 91             key[t]:=delete(left[t],k+1); 92     end 93     else 94         if k<key[t] then 95             delete:=delete(left[t],k) 96         else 97             delete:=delete(right[t],k); 98 end;{ delete } 99 function get_max_number(t:longint):longint;100 begin101     if t=0 then102         exit(19950714);103     get_max_number:=get_max_number(right[t]);104     if get_max_number=19950714 then105         get_max_number:=t;106 end;{ get_max_number }107 function get_min_number(t:longint):longint;108 begin109     if t=0 then110         exit(19950714);111     get_min_number:=get_min_number(left[t]);112     if get_min_number=19950714 then113         get_min_number:=t;114 end;{ get_min_number }115 procedure main;116 var117     x,y,z:longint;118 begin119     root:=0;120     tot:=0;121     read(x);122     while x<>0 do123     begin124         if x=1 then125         begin126             readln(y,z);127             insert(root,z,y);128         end;129         if x=2 then130             if s[root]=0 then131                 writeln(0)132             else133             begin134                 y:=get_max_number(root);135                 writeln(th[y]);136                 delete(root,key[y]);137             end;138         if x=3 then139             if s[root]=0 then140                 writeln(0)141             else142             begin143                 y:=get_min_number(root);144                 writeln(th[y]);145                 delete(root,key[y]);146             end;147         read(x);148     end;149 end;{ main }150 begin151     main;152 end.                

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.