L2 012 關於堆的判斷 小頂堆(詳解)

2021-09-11 11:56:02 字數 1774 閱讀 5922

將一系列給定數字順序插入乙個初始為空的小頂堆h。隨後判斷一系列相關命題是否為真。命題分下列幾種:

每組測試第1行包含2個正整數n(≤ 1000)和m(≤ 20),分別是插入元素的個數、以及需要判斷的命題數。下一行給出區間[−10000,10000]內的n個要被插入乙個初始為空的小頂堆的整數。之後m行,每行給出乙個命題。題目保證命題中的結點鍵值都是存在的。

對輸入的每個命題,如果其為真,則在一行中輸出t,否則輸出f

5 4

46 23 26 24 10

24 is the root

26 and 23 are siblings

46 is the parent of 23

23 is a child of 10

ftf

t

思路:

先來一波概念~

小頂堆:是一種經過排序的完全二叉樹(樹的節點是按從上到下,從左到右的順序緊湊排列的),其中任一非終端節點的資料值均不大於其左子節點和右子節點的值。

heap[i]:=位置i存的元素值。

若從heap[0]開始存,可知:

左兒子編號是自己編號*2+1

右兒子編號是自己編號*2+2

首先先在堆的末尾(在最後一層,最左邊)插入該數值,然後不斷向上提公升至到它比父節點大為止。

先把堆中最後乙個元素複製到根節點,並且刪除最後乙個節點。然後不斷向下交換直到沒有大小點到為止。

若向下交換的時候,左右節點都小於此節點,則交換最小的節點。

模板:

void push(int x)

heap[i]=x;

}int pop()

heap[i]=x;

return ret;

}

ps:處理的時候,別忘了還有負數的情況噠~

**如下:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

typedef pairp;

const int inf=0x3f3f3f3f;

const int n=1005,n1=5005,mod=32767;

int heap[n],sz=0;

string s;

mappos;

void push(int x)

heap[i]=x;

}int getx(int po)

if(s[po]=='-')return -x;

return x;

}int solve()

if(flag==3)

if(flag==4)

}int main()

for(int i=0;i(x,i));

}getchar();

while(m--)

}

L2 012 關於堆的判斷(小頂堆)

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 將一系列給定數字順序插入乙個初始為空的小頂堆h。隨後判斷一系列相關命題是否為真。命題分下列幾種 輸入格式 每組測試第1行包含2個正整數n 1000 和m 20 分別是插入元素的個數 ...

L2 012 關於堆的判斷 (小頂堆的應用)

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 將一系列給定數字順序插入乙個初始為空的小頂堆h。隨後判斷一系列相關命題是否為真。命題分下列幾種 輸入格式 每組測試第1行包含2個正整數n 1000 和m 20 分別是插入元素的個數 ...

L2 012 關於堆的判斷 25分 小頂堆

x is the root x是根結點 x and y are siblings x和y是兄弟結點 x is the parent of y x是y的父結點 x is a child of y x是y的乙個子結點。輸入格式 每組測試第1行包含2個正整數n 1000 和m 20 分別是插入元素的個數 ...