洛谷P2085 最小函数值 题解

洛谷P2085 最小函数值 题解

题目链接:P2085 最小函数值

题意

n n n 个函数,分别为 F 1 , F 2 , … , F n F_1,F_2,\dots,F_n F1,F2,,Fn。定义 F i ( x ) = A i x 2 + B i x + C i ( x ∈ N ∗ ) F_i(x)=A_ix^2+B_ix+C_i(x\in\mathbb N^*) Fi(x)=Aix2+Bix+Ci(xN)。给定这些 A i A_i Ai B i B_i Bi C i C_i Ci,请求出所有函数的所有函数值中最小的 m m m 个(如有重复的要输出多个)。

1 ≤ A i ≤ 10 ,   10 ≤ B i ≤ 100 ,   100 ≤ C i ≤ 1 0 4 1 \leq A_i\le10,~10 \le B_i\le100,~100 \le C_i\le10^4 1Ai10, 10Bi100, 100Ci104

这是一篇随机化优化的奇怪题解

题面十分不清楚。所以稍微修改了一下下。

注意这里的数据范围

根据二次函数对称轴 x = − b 2 a x=-\dfrac{b}{2a} x=2ab

不难发现这些函数均在 [ 0 , + ∞ ) [0,+\infty) [0,+) 单调递增

那就很简单了,直接用个大根堆维护 k k k 大值的方法搞一搞就好了

然后发现时间复杂度最坏似乎 O ( n m log ⁡ m ) O(nm\log m) O(nmlogm)

因此我们可以用随机化乱搞一下,防止特意构造的数据 😎 😎 😎

时间复杂度上界其实还是 O ( n m log ⁡ m ) O(nm\log m) O(nmlogm)

但是实际的复杂度比这个要低一些(然而因为常数又慢了一些

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iomanip>
#include <random>
#include <queue>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f3f3f3f3f
#define N (int)(1e4+15)

mt19937 rd(time(0));
priority_queue<int> q;
int n,m,a[N],b[N],c[N],tmp[N],ans[N];
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    // freopen("check.in","r",stdin);
    // freopen("check.out","w",stdout);
    cin >> n >> m;
    for(int i=1; i<=m; i++) 
        tmp[i]=i, q.push(INF);
    shuffle(tmp+1,tmp+1+n,rd);
    for(int i=1; i<=n; i++)
        cin >> a[tmp[i]] >> b[tmp[i]] >> c[tmp[i]];
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            int k=a[i]*j*j+b[i]*j+c[i];
            if(k<q.top()){q.pop();q.push(k);}
            else break;
        }
    
    for(int i=m; i>=1; i--)
        ans[i]=q.top(),q.pop();
    for(int i=1; i<=m; i++)
        cout << ans[i] << " \n"[i==m];
    return 0;
}

转载请说明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值