SJTU最小值的堆排優化尋找

2021-10-05 20:55:17 字數 3207 閱讀 9085

【問題描述】

給定乙個長度為n的數列,現宣告兩種操作。

第一種操作add,將數列的第i個元素的值增加x

第二種操作query,詢問此時數列中最小的元素是哪個。

【輸入形式】

第一行為一正整數n(<=500000)表示數列長度。

第二行為n個整數,表示數列初始元素。

第三行為乙個正整數q(<=1000000),表示運算元。

接下來q行,每行描述一種操作:

add i x

表示數列第i(1<=i<=n)個元素增加x(-1000<=x<=1000)。

query

輸出此時數列中最小元素所在位置,以及最小值。多個最小值輸出下標最小的那個。

【輸出形式】

對於每個query操作,輸出一行,包含兩個數字,第乙個數字為最小值所在下標,第二個數字表示最小值。

【樣例輸入】5

1 2 3 4 5

5query

add 1 2

query

add 2 2

query

【樣例輸出】

1 12 21 3

#include

#include

#pragma once

using

namespace std;

template

<

class

t>

class

priorityqueue

//class 是類的標誌勿忘

;private

:int currentlength;

int maxsize;

int*map;

//匹配不同下標

struct node* node;

void

percolatedown

(int hole)

;//向下過濾

void

percolateup

(int hole)

;//向上過濾

public

:priorityqueue

(int size =

100)

~priorityqueue()

//構造析構類

void

buildheap()

;//建堆

bool

isempty()

const

//詢問類

void

gethead()

const

void

add(

const

int&x,

const

int&y)

;void

enqueue

(const t&x,

const

int&y)

;//非常量引用的初始值必須為左值};

template

<

class

t>

void priorityqueue

::add

(const

int&x,

const

int&y)

if(y >0)

}template

<

class

t>

void priorityqueue

::enqueue

(const t&x,

const

int&y)

//是加入t型別值,不是hole

template

<

class

t>

void priorityqueue

::percolatedown

(int hole)

if (array[hole * 2] > array[hole * 2 + 1])

先找到最小孩子再比較代際可以減少此處約一半計算數*/

/*while (hole*2 <= currentlength)

if (tmp > node1[child].elem || tmp == node1[child].elem&& tmp1 > node1[child].num)

else

}*/for(

; hole *

2<= currentlength; hole = child)

if(tmp > node[child]

.elem || tmp == node[child]

.elem&& tmp1 > node[child]

.num)

else

} node[hole]

.elem = tmp;

//賦值

node[hole]

.num = tmp1;

map[tmp1]

= hole;

}template

<

class

t>

void priorityqueue

::percolateup

(int hole)

else

} node[hole]

.elem = tmp;

//賦值

node[hole]

.num = tmp1;

map[tmp1]

= hole;

}template

<

class

t>

void priorityqueue

::buildheap()

//建堆

}int

main()

x.buildheap()

; cin >> m;

char ch[6]

;char ch1[6]

="add"

;char ch2[6]

="query"

;//string s;

int a, b;

for(i =

0; i <= m -

1; i++)if

(ch[0]

== ch2[0]

)//query

}system

("pause");

}

尋找旋轉陣列的最小值

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1。這道題的要求是尋找最小值,附加的條件是給出了兩個有序的陣列。如果旋轉的數字個數大於0 可...

同時尋找序列的最大最小值

問題描述 給定乙個長度為n n 2 的無序正整數序列ary,要求同時找到其中最大和最小值元素,並返回其和。分析 將最大值max和最小值min看成一對 mix,min 每次從序列中成對地取出兩個元素,將其中較小者與min比較並更新,將其中較大者與max必將並更新,這樣處理每一對元素只需要3次比較,整個...

尋找旋轉陣列中的最小值

假設乙個旋轉排序的陣列其起始位置是未知的 比如0 1 2 4 5 6 7 可能變成是4 5 6 7 0 1 2 你需要找到其中最小的元素。你可以假設陣列中不存在重複的元素。分析 尋找陣列中某一類特定的值,很容易聯想到二分法。本題中陣列是旋轉的,而且是排序的,還是比較有規律,可以分情況討論mid的落點...