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

2021-07-04 18:40:58 字數 1203 閱讀 3782

有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<=10 000。

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

3 10

4 5 3

3 4 5

1 7 1

9 12 12 19 25 29 31 44 45 54

n,m<=10,000

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

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

時間複雜度o(mlogn)

#include

#include

#include

#include

using

namespace

std;

struct func

data[10050];

struct node

friend

bool

operator

<(const node &a,const node &b) heap[10050];

int n,m;

int t[10050];

priority_queuevector

,greater> q;

int calc(int k)

int main()

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

for(int i=1;iprintf("%d ",q.top().data);

int cc=q.top().k;

node temp;

temp.data=calc(cc);

temp.k=cc;

q.pop();

q.push(temp);

}printf("%d\n",q.top().data);

return

0;}

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

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和...

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...