luogu P5290 [十二省联考2019]春节十二响 优先队列_启发式合并

本文分享了洛谷P5290[十二省联考2019]春节十二响问题的优先队列实现,通过启发式合并的方法进行解答。文章包含完整的代码示例,并详细解释了如何利用优先队列和启发式合并来解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

luogu P5290 [十二省联考2019]春节十二响 优先队列_启发式合并

思维难度不大,在考上上写的启发式合并写错了,只拿了 60 pts,好难过QAQ

Code:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#include <queue> 
#define maxn 200001  
#define setIO(s) freopen(s".in","r",stdin) ,freopen(s".out","w",stdout) 
using namespace std; 
priority_queue<int>Q[maxn];    
int edges; 
int n; 
int head[maxn],to[maxn],nex[maxn],val[maxn],f[maxn]; 
void addedge(int u,int v){
	nex[++edges] = head[u], head[u] = edges, to[edges] = v; 
}
int tmp[maxn]; 
int id[maxn]; int idx; 
void DFS(int u){      
    id[u]=++idx; 
	for(int v=head[u];v;v=nex[v]){
		DFS(to[v]); 
		if(Q[id[u]].size() < Q[id[to[v]]].size()) swap(id[u],id[to[v]]); 
        int m=Q[id[to[v]]].size(); 
        for(int i=1;i<=m;++i) {
            tmp[i]=max(Q[id[u]].top(),Q[id[to[v]]].top()); 
            Q[id[u]].pop(); Q[id[to[v]]].pop(); 
        }
        for(int i=1;i<=m;++i) Q[id[u]].push(tmp[i]); 
	}
	Q[id[u]].push(val[u]);              
}
int main(){
	//setIO("spring"); 
	scanf("%d",&n); 
	for(int i = 1;i <= n; ++i) scanf("%d",&val[i]); 
	for(int i = 2;i <= n; ++i) scanf("%d",&f[i]); 
	for(int i = 2;i <= n; ++i) addedge(f[i],i); 
	DFS(1); 
	long long ans = 0; 
	while(!Q[id[1]].empty())ans += (long long)Q[id[1]].top(), Q[id[1]].pop(); 
	printf("%lld\n",ans); 
	return 0;  
}

  

posted @ 2019-04-08 19:50 EM-LGH 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值