洛谷P2085 最小函式值 堆

2021-09-22 08:04:58 字數 1448 閱讀 1556

有n

nn個函式,分別為f1,

f2,.

..,f

nf1,f2,...,fn

f1,f2,

...,

fn。定義fi(

x)=a

i×x2

+bi×

x+ci

(x∈n

∗)

fi(x)=a_i\times x^2+b_i\times x+c_i(x∈n*)

fi(x)=

ai​×

x2+b

i​×x

+ci​

(x∈n

∗)。給定這些a

ia_i

ai​、b

ib_i

bi​和c

ic_i

ci​,請求出所有函式的所有函式值中最小的m

mm個(如有重複的要輸出多個)。

作為一道正常的題目,肯定是滿足0≤a

i,bi

,c

i0\leq a_i,b_i,c_i

0≤ai​,

bi​,

ci​的。否則x

xx越大函式值就越小。

顯然f i(

x)≤f

i(x+

1)

fi(x)\leq fi(x+1)

fi(x)≤

fi(x

+1)。所以最基本的思路就是維護n

nn個指標,每個指標指向f1∼

fn

f1\sim fn

f1∼f

n函式的x

xx有多大。

每次選擇n

nn個函式值裡面最小的,並且將這格函式的下乙個計算出來。

這樣時間複雜度是o(n

m)

o(nm)

o(nm)的。

我們發現查詢最小值這一部分是可以用堆來維護的。這樣每次的時間複雜度就是o

(log⁡n

)o(\log n)

o(logn

),總的時間複雜度是o(m

log⁡n)

o(m\log n)

o(mlogn)

#include

#include

#define mp make_pair

using

namespace std;

const

int n=

10010

;int n,m,a[n]

,b[n]

,c[n]

,cnt[n]

;priority_queueint,

int>

> q;

intf

(int x,

int y)

intmain()

while

(m--

)return0;

}

洛谷 P2085 最小函式值

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

P2085 最小函式值 洛谷

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

洛谷P2085 最小函式值

題目大意 有n個函式,分別為f1,f2,fn。定義fi x ai x 2 bi x ci x n 給定這些ai bi和ci,要求出所有函式的所有函式值中最小的m個 如有重複的要輸出多個 解題思路 因為 n,m leq 10000 暴力列舉肯定是不可取的。我們發現,fi x 一定不會大於fi x 1 ...