题目分析:

对于一个根,假设我们对每个子树分别求出了一种答案,那么怎么合并答案是最小的呢?

首先考虑这些答案里面最大的那个数字,它肯定要融合其它组里面的最大数字。以此类推

所以最好的合并方式是,每个子树的答案从大到小排序,然后依次合并。

然后我们会发现,这个其实是可以划分子问题的,因为如果某个子树不按照这种方式划分,那么必然不会使得某个位置变小另一个位置变大,只会使得相应位置变大。

所以按子树划分下去,把堆合并就行。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = ;
  5.  
  6. int n;
  7. int a[maxn],f[maxn];
  8. vector <int> g[maxn];
  9. int pts[maxn],num;
  10. priority_queue<int,vector<int>,less<int> > pq[maxn],hc;
  11.  
  12. void read(){
  13. scanf("%d",&n);
  14. for(int i=;i<=n;i++) scanf("%d",&a[i]);
  15. for(int i=;i<=n;i++) scanf("%d",&f[i]),g[f[i]].push_back(i);
  16. }
  17.  
  18. void dfs(int now){
  19. for(int i=;i<g[now].size();i++) {
  20. dfs(g[now][i]);
  21. if(pq[pts[now]].size() < pq[pts[g[now][i]]].size())
  22. pts[now] = pts[g[now][i]];
  23. }
  24. for(int i=;i<g[now].size();i++){
  25. if(pts[now] != pts[g[now][i]]){
  26. while(pq[pts[g[now][i]]].size()){
  27. int k = pq[pts[now]].top(); pq[pts[now]].pop();
  28. int z = pq[pts[g[now][i]]].top(); pq[pts[g[now][i]]].pop();
  29. hc.push(max(k,z));
  30. }
  31. while(!hc.empty()){pq[pts[now]].push(hc.top());hc.pop();}
  32. }
  33. }
  34. if(pts[now] == ) pts[now] =++num;
  35. pq[pts[now]].push(a[now]);
  36. }
  37.  
  38. int main(){
  39. read();
  40. dfs();
  41. long long ans = ;
  42. while(!pq[pts[]].empty()){
  43. ans += pq[pts[]].top();
  44. pq[pts[]].pop();
  45. }
  46. printf("%lld\n",ans);
  47. return ;
  48. }

Luogu5290 [十二省联考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. Luogu5290 十二省联考2019春节十二响(贪心+启发式合并)

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

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

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

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

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

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

    思维难度不大,在考上上写的启发式合并写错了,只拿了 60 pts,好难过QAQ 没什么太难的,在考场上想出链的部分分之后很容易就能想到正解.没错,就是非常短的启发式合并.注意一下,写的要漂亮一点,否则 ...

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

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

随机推荐

  1. make 实例 二 V56

    ######################################################################### # # Makefile used for buil ...

  2. WebSocket——SuperWebSocket实现服务端和客户端

    WebSocket——SuperWebSocket实现服务端和客户端具体实现如下: 注:本作者是基于vs2019 enterprise版本,所有项目均为.Net Framwork4.7版本(因为Web ...

  3. Comparison and difference for Default geodatabase,Current workspace,Scratch workspace,Home Folder

    Comparison and difference for Default geodatabase,Current workspace,Scratch workspace,Home Folder 商务 ...

  4. GIS地理工具案例教程——栅格分割

    GIS地理工具案例教程--栅格分割 商务合作,科技咨询,版权转让:向日葵,135-4855__4328,xiexiaokui#qq.com 目的:利用多边形要素类去分割栅格,每个多边形裁剪出对应的范围 ...

  5. 使用 CircleCI 2.0 进行持续集成/持续部署

    使用 CircleCI 2.0 进行持续集成/持续部署 - 简书https://www.jianshu.com/p/36af6af74dfc Signup - CircleCIhttps://circ ...

  6. 使用AWS Lambda,API Gateway和S3 Storage快速调整图片大小

    https://www.obytes.com/blog/2019/image-resizing-on-the-fly-with-aws-lambda,-api-gateway,-and-s3-stor ...

  7. colock

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  8. realsense 图片与点云数据采集

  9. invalid application of ‘sizeof’ to incomplete type

    sizeof 后面所跟的数据类型没有定义,或者找不到定义的地方 eg: 头文件中定义结构体如下: struct PersonaL{ char name[]; int  age; }; 但是在cpp中使 ...

  10. Qt编写气体安全管理系统10-数据导出

    一.前言 数据导出一般指导出到excel表格,可能有部分用户还需要导出到pdf,因为pdf基本上不可编辑,防止用户重新编辑导出的数据,excel可能绝大部分用过电脑的人都知道,广为流行,主要就是微软的 ...