P7840 「C.E.L.U-03」重构
首先,题目要求连
我们不用去考虑树的形态,只用去考虑如何分配剩下的
这里我就使用了优先队列,运用贪心思想每次取出
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int n,v[N],ans,d[N];
struct nod{
int w,id;
bool operator < (const nod t) const{
return w>t.w;
}
}p[N];
priority_queue<nod>q;
int get(int x){
return v[x]*(2*d[x]+1);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&v[i]);
ans+=v[i];
d[i]=1;
p[i].id=i;
p[i].w=get(i);
q.push(p[i]);
}
for(int i=1;i<=n-2;i++){
nod temp=q.top();
q.pop();
ans+=temp.w;
d[temp.id]++;
p[temp.id].w=get(temp.id);
q.push(p[temp.id]);
}
printf("%d",ans);
return 0;
}