有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
(logn
)o(\log n)
o(logn
),總的時間複雜度是o(m
logn)
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 ...