堆的模板題【洛谷P3378】
阿新 • • 發佈:2017-05-21
urn 我們 syn code space mes con ret pre
題目描述
如題,初始小根堆為空,我們需要支持以下3種操作:
操作1: 1 x 表示將x插入到堆中
操作2: 2 輸出該小根堆內的最小數
操作3: 3 刪除該小根堆內的最小數
輸入輸出格式
輸入格式:
第一行包含一個整數N,表示操作的個數
接下來N行,每行包含1個或2個正整數,表示三種操作,格式如下:
操作1: 1 x
操作2: 2
操作3: 3
輸出格式:
包含若幹行正整數,每行依次對應一個操作2的結果。
輸入樣例#1:5 1 2 1 5 2 3 2輸出樣例#1:
2 5
1 #include<bits/stdc++.h> 2 usingnamespace std; 3 int c[1000010];//註意數組的大小 4 int n; 5 int num=0; 6 7 void Swap(int i,int j)//Swap函數註意大寫,否則有可能與庫函數沖突 8 { 9 int t=c[i]; 10 c[i]=c[j]; 11 c[j]=t; 12 } 13 14 void siftdown(int k) 15 { 16 int t,flag=0; 17 while(k*2<=num&&flag==0) 18 { 19 if(c[k]>c[k*2])20 t=k*2; 21 else t=k;//標記!!! 22 if(k*2+1<=num) 23 { 24 if(c[t]>c[k*2+1]) 25 t=k*2+1;//標記!!! 26 } 27 if(t!=k) 28 { Swap(t,k);k=t;}//標記!!! 29 else flag=1; 30 } 31 return ; 32 } 33 34 void siftup(int k) 35 { 36 int flag=0; 37 while(k!=1&&flag==0) 38 { 39 if(c[k]<c[k/2]) 40 Swap(k,k/2); 41 else flag=1; 42 k=k/2;//標記!!! 43 } 44 return ; 45 } 46 47 int main() 48 { 49 ios::sync_with_stdio(false);//讀入虐我千百遍…… 50 cin>>n; 51 int t1,t2; 52 while(n--) 53 { 54 cin>>t1; 55 if(t1==1) 56 { 57 cin>>t2; 58 num++; 59 c[num]=t2; 60 siftup(num); 61 continue; 62 } 63 if(t1==2) 64 { cout<<c[1]<<endl;continue;} 65 if(t1==3) 66 { 67 c[1]=c[num]; 68 num--;siftdown(1); 69 continue; 70 } 71 } 72 return 0; 73 }
堆的模板題【洛谷P3378】