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

没什么太难的,在考场上想出链的部分分之后很容易就能想到正解.
没错,就是非常短的启发式合并.
注意一下,写的要漂亮一点,否则会疯狂 TLE.
还有一个细节,想交换优先队列时不能直接交换队列,而是对于树中每个节点都存一个在实际队列编号中的位置,计为 $idx[u]$,每次交换 $idx[u]$ 和 $idx[to[v]]$.

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;
}

  

luogu P5290 [十二省联考2019]春节十二响 优先队列_启发式合并的更多相关文章

  1. P5290 [十二省联考2019]春节十二响

    题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方 ...

  2. P5290 [十二省联考2019]春节十二响(堆+启发式合并)

    P5290 [十二省联考2019]春节十二响 从特殊到一般 我们先看链的情况. 我们把点$1$左右的两条子链分别扔入堆里 每次取出两个堆的最大值,把答案累加上更大的那个(另一堆为空则直接加上去). 那 ...

  3. Luogu P5290 / LOJ3052 【[十二省联考2019]春节十二响】

    联考Day2T2...多亏有这题...让我水了85精准翻盘进了A队... 题目大意: 挺简单的就不说了吧...(这怎么简述啊) 题目思路: 看到题的时候想了半天,不知道怎么搞.把样例画到演草纸上之后又 ...

  4. 【堆的启发式合并】【P5290】[十二省联考2019]春节十二响

    Description 给定一棵 \(n\) 个节点的树,点有点权,将树的节点划分成多个集合,满足集合的并集是树的点集,最小化每个集合最大点权之和. Limitation \(1~\leq~n~\le ...

  5. [LOJ3052] [十二省联考 2019] 春节十二响

    题目链接 LOJ:https://loj.ac/problem/3052 洛谷:https://www.luogu.org/problemnew/show/P5290 BZOJ:https://www ...

  6. Luogu P5290 [十二省联考2019]春节十二响

    这题是最近看到的今年省选题中最良心的一道了吧 看题+想题+写题都可以在0.5h内解决,送分含义明显啊 首先理解了题意后我们很快就能发现两个点如果要被分在一段那么必须在它们的祖先处合并 首先我们考虑下二 ...

  7. 【题解】Luogu P5290 [十二省联考2019]春节十二响

    原题传送门 每个点维护一个堆,表示这个点及其子树所需的每段内存的空间 搜索时从下向上做启发式合并堆中信息,最后根节点堆中所有内存空间之和就是答案 #include <bits/stdc++.h& ...

  8. Luogu5290 十二省联考2019春节十二响(贪心+启发式合并)

    考虑链的做法,显然将两部分各自从大到小排序后逐位取max即可,最后将根计入.猜想树上做法相同,即按上述方式逐个合并子树,最后加入根.用multiset启发式合并即可维护.因为每次合并后较小集合会消失, ...

  9. LuoguP5290 [十二省联考2019]春节十二响 | 启发式合并

    还有33天就要高考了,我在干啥-- 题目概述 一棵有根树,每个节点有权值. 要求把所有节点分成组,具有祖先-后代关系的两个节点不能被分到同一组. 每一组的代价是所包含的节点的最大权值,最小化所有组的代 ...

随机推荐

  1. 路飞学城Python-Day75

    1.什么是Django? Django是一个web框架,也是python中最火的一个框架,应用最多,内容最全 2.什么是web框架? python的一个脚本就是一个应用程序,web框架就是和前端有关系 ...

  2. 自己对WEBGL坐标系的转换过程的理解【如图】

  3. js通过String取得对应全局Object的值

    //假设有个全局对象Person var Person = { 'name' : 'alice' } //通过某种配置,获得了字符串形式的对象名 var thisPerson = 'Person'; ...

  4. 洛谷 P1567 统计天数

    题目背景 统计天数 题目描述 炎热的夏日,KC非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续N(1& ...

  5. 4.1、Ansible模块

    ansible-doc -l    列出所有模块 ansible-doc 模块名    查看模块的help说明 ansible-doc -s  module_name:获取指定模块的使用信息 ***文 ...

  6. Python编程:从入门到实践 - matplotlib篇 - plot & scatter

    matplotlib篇 plot & scatter # filename.py 获取当前文件名方法 import sys # 当前文件名 print(sys.argv[0]) # 去除后缀后 ...

  7. Git学习总结(4)——我的Git忽略文件

    *.bak *.txt *.vm .gitignore #svn .svn/ # built application files *.apk *.ap_ # files for the dex VM ...

  8. ActiveMQ 整合 spring

    一.添加 jar 包 <dependency> <groupId>org.apache.activemq</groupId> <artifactId>a ...

  9. 洛谷—— P3119 [USACO15JAN]草鉴定Grass Cownoisseur || BZOJ——T 3887: [Usaco2015 Jan]Grass Cownoisseur

    http://www.lydsy.com/JudgeOnline/problem.php?id=3887|| https://www.luogu.org/problem/show?pid=3119 D ...

  10. HDU 4344

    其实不过是大整数分解... 注意两点:注意L 不能==N 但是,N却可以是素数...囧 #include <iostream> #include <cstdio> #inclu ...