二叉堆 k路歸併問題(BSOJ1941)

2022-05-24 09:03:10 字數 1342 閱讀 1598

description

有n個函式,分別為f1,f2,...,fn。定義fi(x)=ai*x^2+bi*x+ci(x∈n*)。給定這些ai、bi和ci,請求出所有函式的所有函式值中最小的m個(如有重複的要輸出多個)。

input

第一行輸入兩個正整數n和m。以下n行每行三個正整數,其中第i行的三個數分別位ai、bi和ci。ai<=10,bi<=100,ci<=10 000。

output

輸出將這n個函式所有可以生成的函式值排序後的前m個元素。這m個數應該輸出到一行,用空格隔開。

sample input

3 10

4 5 3

3 4 5

1 7 1

sample output

9 12 12 19 25 29 31 44 45 54

hint

n,m<=10,000

thinking

首先根據二次函式的知識可以判斷出,這裡的每個函式在x>0範圍內都是單調遞增的。

可以根據堆的思想做這道題。開始時將每乙個函式的第乙個函式值加入小根堆,注意這裡堆必須記錄是第幾個函式。每次取出堆頂元素加入到答案中,同時將堆頂元素所在的函式下標+1,將新得到的函式值加入堆中。重複以上步驟直到取出m個答案。

時間複雜度o(mlogn)

code

1 #include2 #include3 #include4 #include5

using

namespace

std;67

struct

func

8data[10050

];11

struct

node

1215 friend bool

operator

<(const node &a,const node &b)

16//

這兩行用來自定義node型別的比較函式以便優先佇列呼叫

17 }heap[10050

];18

19int

n,m;

2021

int t[10050

];22

23 priority_queue,greater>q;

24int calc(int

k)25

3334

intmain()

3542

for(int i=1;i<=n;i++)

4349

for(int i=1;i)

5059 printf("

%d\n

",q.top().data);

60return0;

61 }

二叉堆 k路歸併問題(BSOJ1941)

有n個函式,分別為f1,f2,fn。定義fi x ai x 2 bi x ci x n 給定這些ai bi和ci,請求出所有函式的所有函式值中最小的m個 如有重複的要輸出多個 第一行輸入兩個正整數n和m。以下n行每行三個正整數,其中第i行的三個數分別位ai bi和ci。ai 10,bi 100,ci...

2977 二叉堆練習1

時間限制 10 s 空間限制 32000 kb 題目等級 silver 題解檢視執行結果 已知乙個二叉樹,判斷它是否為二叉堆 小根堆 輸入描述 input description 二叉樹的節點數n和n個節點 按層輸入 輸出描述 output description yes或no 樣例輸入 sampl...

codevs3110二叉堆練習1

題目描述 description 給定n n 500,000 和n個整數 較有序 將其排序後輸出。輸入描述 input description n和n個整數 輸出描述 output description n個整數 公升序 樣例輸入 sample input 512 11 10 8 9 樣例輸出 s...