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