Luogu5290 [十二省联考2019] 春节十二响 【贪心】【堆】
题目分析:
对于一个根,假设我们对每个子树分别求出了一种答案,那么怎么合并答案是最小的呢?
首先考虑这些答案里面最大的那个数字,它肯定要融合其它组里面的最大数字。以此类推
所以最好的合并方式是,每个子树的答案从大到小排序,然后依次合并。
然后我们会发现,这个其实是可以划分子问题的,因为如果某个子树不按照这种方式划分,那么必然不会使得某个位置变小另一个位置变大,只会使得相应位置变大。
所以按子树划分下去,把堆合并就行。
代码:
#include<bits/stdc++.h>
using namespace std; const int maxn = ; int n;
int a[maxn],f[maxn];
vector <int> g[maxn];
int pts[maxn],num;
priority_queue<int,vector<int>,less<int> > pq[maxn],hc; void read(){
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=n;i++) scanf("%d",&f[i]),g[f[i]].push_back(i);
} void dfs(int now){
for(int i=;i<g[now].size();i++) {
dfs(g[now][i]);
if(pq[pts[now]].size() < pq[pts[g[now][i]]].size())
pts[now] = pts[g[now][i]];
}
for(int i=;i<g[now].size();i++){
if(pts[now] != pts[g[now][i]]){
while(pq[pts[g[now][i]]].size()){
int k = pq[pts[now]].top(); pq[pts[now]].pop();
int z = pq[pts[g[now][i]]].top(); pq[pts[g[now][i]]].pop();
hc.push(max(k,z));
}
while(!hc.empty()){pq[pts[now]].push(hc.top());hc.pop();}
}
}
if(pts[now] == ) pts[now] =++num;
pq[pts[now]].push(a[now]);
} int main(){
read();
dfs();
long long ans = ;
while(!pq[pts[]].empty()){
ans += pq[pts[]].top();
pq[pts[]].pop();
}
printf("%lld\n",ans);
return ;
}
Luogu5290 [十二省联考2019] 春节十二响 【贪心】【堆】的更多相关文章
- P5290 [十二省联考2019]春节十二响
题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方 ...
- P5290 [十二省联考2019]春节十二响(堆+启发式合并)
P5290 [十二省联考2019]春节十二响 从特殊到一般 我们先看链的情况. 我们把点$1$左右的两条子链分别扔入堆里 每次取出两个堆的最大值,把答案累加上更大的那个(另一堆为空则直接加上去). 那 ...
- Luogu P5290 / LOJ3052 【[十二省联考2019]春节十二响】
联考Day2T2...多亏有这题...让我水了85精准翻盘进了A队... 题目大意: 挺简单的就不说了吧...(这怎么简述啊) 题目思路: 看到题的时候想了半天,不知道怎么搞.把样例画到演草纸上之后又 ...
- 【堆的启发式合并】【P5290】[十二省联考2019]春节十二响
Description 给定一棵 \(n\) 个节点的树,点有点权,将树的节点划分成多个集合,满足集合的并集是树的点集,最小化每个集合最大点权之和. Limitation \(1~\leq~n~\le ...
- Luogu5290 十二省联考2019春节十二响(贪心+启发式合并)
考虑链的做法,显然将两部分各自从大到小排序后逐位取max即可,最后将根计入.猜想树上做法相同,即按上述方式逐个合并子树,最后加入根.用multiset启发式合并即可维护.因为每次合并后较小集合会消失, ...
- Luogu P5290 [十二省联考2019]春节十二响
这题是最近看到的今年省选题中最良心的一道了吧 看题+想题+写题都可以在0.5h内解决,送分含义明显啊 首先理解了题意后我们很快就能发现两个点如果要被分在一段那么必须在它们的祖先处合并 首先我们考虑下二 ...
- [LOJ3052] [十二省联考 2019] 春节十二响
题目链接 LOJ:https://loj.ac/problem/3052 洛谷:https://www.luogu.org/problemnew/show/P5290 BZOJ:https://www ...
- luogu P5290 [十二省联考2019]春节十二响 优先队列_启发式合并
思维难度不大,在考上上写的启发式合并写错了,只拿了 60 pts,好难过QAQ 没什么太难的,在考场上想出链的部分分之后很容易就能想到正解.没错,就是非常短的启发式合并.注意一下,写的要漂亮一点,否则 ...
- LuoguP5290 [十二省联考2019]春节十二响 | 启发式合并
还有33天就要高考了,我在干啥-- 题目概述 一棵有根树,每个节点有权值. 要求把所有节点分成组,具有祖先-后代关系的两个节点不能被分到同一组. 每一组的代价是所包含的节点的最大权值,最小化所有组的代 ...
随机推荐
- js的prototype理解
转载:https://www.cnblogs.com/douyage/p/8630529.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实 ...
- Binder 原理剖析***
一. 前言 希望更加深入理解 Binder 实现机制的,可以阅读文末的参考资料以及相关源码. 二. Binder 概述 简单介绍下什么是 Binder.Binder 是一种进程间通信机制,基于开源的 ...
- 即时通信系统IM--XMPP
即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷:服务提供商也提供了越来越丰富的通讯服务功能. 不容置疑,Internet已经 ...
- GIS地理工具案例教程——批量去除多边形的重叠部分
GIS地理工具案例教程--批量去除多边形的重叠部分 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 问题:几乎所有的手工生产的数据,都存在多边形 ...
- zookeeper/kafka的部署
Ubuntu中安装zookeeper及kafka并配置环境变量 首先安装zookeeper zookeeper需要jdk环境,请在jdk安装完成的情况下安装zookeeper1.从官网下载zook ...
- (转)Darknet模型与Tensorflow模型相互转换
目前darknet框架下的模型训练都是在C环境下训练的,难免较为晦涩,如果能将模型转换到Tensorflow环境下完成模型的训练,在将训练好的权重转为Darknet可以识别的权重部署到实际应用中.这样 ...
- ubuntu18.04安装docker和开通对外2375端口(方便portainer管理)
date: 2019-08-03 21:39:37 author: headsen chen apt-get install apt-transport-https ca-certificates ...
- Ionic4.x ion-refresher 下拉更新
官方文档:https://ionicframework.com/docs/api/refresher <ion-header> <ion-toolbar> <ion-ti ...
- Python3基础 运算 加减乘除、取余数
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- SQLite数据库数据类型详解
数据类型 类型 描 述 bit 整型 bit 数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或Fa lse .O ...