洛谷 P2085 最小函数值 最小堆
代码如下:
#include<stdio.h>
#include<iostream>
#include<vector>
#include<math.h>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,a[10005],b[10005],c[10005];
int f[10005];
struct node{
int val;
int k;
}p[10005];
void swap_func(int a,int b){
int t1,t2;
t1=p[a].val,t2=p[a].k;
p[a].val=p[b].val;
p[a].k=p[b].k;
p[b].val=t1;
p[b].k=t2;
}
void min_heapify(int i,int h){
int l=2*i;
int r=2*i+1;
int smallest=i;
if(l<=h&&p[l].val<p[i].val){
smallest=l;
}
if(r<=h&&p[r].val<p[smallest].val){
smallest=r;
}
if(smallest!=i){
swap_func(smallest,i);
min_heapify(smallest,h);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
f[i]=1;
p[i].val=a[i]*f[i]*f[i]+b[i]*f[i]+c[i];
p[i].k=i;
}
for(int i=n/2;i>0;i--){
min_heapify(i,n);
}
for(int i=0;i<m;i++){
printf("%d ",p[1].val);
f[p[1].k]++;
p[1].val=a[p[1].k]*f[p[1].k]*f[p[1].k]+b[p[1].k]*f[p[1].k]+c[p[1].k];
min_heapify(1,n);
}
return 0;
}