另类解法,求大佬分析复杂度,是AC代码且有注释,用set习惯了没有用优先队列```cpp
#include<bits/stdc++.h>
#define N 10050
typedef long long ll;
using namespace std;
ll fun(ll a,ll b,ll c,ll x){
return a*x*x+b*x+c; //算函数值
}
ll a[N],b[N],c[N];
set<ll>Num;//存放还可用来更新m个最小值的函数的序号
set<pair<ll,ll>>S;//利用set优先排序第一项,用第一项存函数值,第二个项存该值出处
int main(){
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
Num.insert(i);
cin>>a[i]>>b[i]>>c[i];
}
for(int x=1;Num.size();x++){//如果还有函数能用来更新这m个最小值
for(auto p=Num.begin();p!=Num.end();p++){
S.insert({fun(a[*p],b[*p],c[*p],x),*p});
}
while(S.size()>m){//维持最小的m个
auto q=S.end();
q--;
if(Num.find(q->second)!=Num.end()){
Num.erase(q->second);//这个函数可以不用再遍历了,因为接下来用它取到的也只会比这个最大值还大
}
S.erase(q);//删除最大的那个数
}
}
for(auto p=S.begin();p!=S.end();p++){
cout<<p->first<<" ";
}//答案
return 0;
}