分析:這題看起來非常唬人,其實不難。。。。。四個judge基本沒啥差,就是輸入稍微注意一下,只要知道怎麼構造乙個堆是非常水的一道題目
堆的話就是二叉樹,兒子的值一定不小於父親的值,左子樹是父親節點的2倍,右子樹是父親節點2倍+1
用的是向上浮動的方法構造,聽大牛說「必須注意,因為題目要求按照插入的順序建立,所以是邊插入邊調整的,必須用向上調整,每次輸入乙個數之後就將它向上調整。(兩者建立出來的二叉樹不同)而不能採用先轉換為二叉樹的方式再向下調整。」
不過具體原因我也不知道。。。。。
上**吧
1 #include2using
namespace
std;
3 typedef long
long
ll;4
const
int inf=1
<<30;5
const
double pi=acos(-1);6
const
int mod=998244353;7
const
int maxn=1050;8
const
int maxm=6300;9
int a[maxn];int
n,m;
10void upadjust(int
i)else19}
20}21void judge1(int
x)25
void judge2(int x,int
y)31
if(idxa>idxb) swap(idxa,idxb);//
保證左邊的是a,接下來好判斷
32if(idxa%2==0&&idxb-idxa==1)printf("
t\n"
);33
else printf("
f\n"
); 34}35
void judge3(int x,int
y)41
if(idxa*2==idxb||idxa*2==idxb-1)printf("
t\n"
);42
else printf("
f\n"
); 43}44
void judge4(int x,int
y)50
if(idxb*2==idxa||idxb*2==idxa-1)printf("
t\n"
);51
else printf("
f\n"
); 52}53
intmain()
59char c[100
];60
intx,y;
61for(int i=0;i)
67else
73else
78else82}
83}84}
85return0;
86 }
排序 4 堆排序
將待排序的序列構成乙個大頂堆。此時,序列的最大值就是堆頂的根結點。將它移走 就是,將其與堆陣列的末尾元素交換,此時末尾的元素就是最大值 然後將剩餘的n 1個序列重新構成乙個堆,如此反覆。其中關鍵問題 1 如何將無序序列構成乙個堆 2 輸出堆頂元素後,如何調整公升序元素為乙個堆 4.堆排序 堆調整 v...
排序二 堆排序
子結點的鍵值或索引總是小於 或者大於 它的父節點。堆通過一維陣列實現。在起始陣列為 0 的情形中 父節點i的左子節點在位置 2 i 1 父節點i的右子節點在位置 2 i 2 子節點i的父節點在位置 floor i 1 2 堆中的最大值總是位於根節點。堆中定義以下幾種操作 1 最大堆調整 max he...
排序七 堆排序
時間複雜度 最好 o n o n 平均o n o nlogn 最差o n o nlogn 空間複雜度 o n o 1 穩定性 不穩定 堆 順序儲存的完全二叉樹,其每個結點均小於等於或大於等於其子節點。小根堆 每個結點元素的值都小於等於其子節點元素的值的堆。s i s 2 i 1 s i s 2 i ...