就是容易想到维护每个节点的优先队列啦,优先队列的长度为K,每个节点的优先队列为子节点优先队列的合并,一共有n个节点,每个节点合并所需时间为O(nlogn),所以总的时间复杂度为O(n^2logn)不能接受。我们都知道优先队列是用普通的二叉堆实现的,普通的二叉堆又是由普通的二叉树实现的,堆的合并需要nlogn,虽然可以合并,但这是十分慢的。所以我们需要用到另一种可合并堆——左式堆(又叫左偏堆),它是用左式树(又叫左偏树)实现的。这种堆的合并只需要O(logn),因此总的时间复杂度为O(nlogn)可以接受。然后就是一边dfs一边维护左偏树,顺带计算出每个节点的值,加起来就是答案啦。然而,dfs不行,会RE,我还是第一次遇到树的dfs会爆栈的,所以就要从叶子节点往上bfs,这样就可以啦。

关于左偏树,可合并堆的介绍以及模板:

http://blog.csdn.net/theprinceofelf/article/details/7247454

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const int mod = 1000000007;struct Node
{int v[maxn];int l[maxn],r[maxn];int c[maxn];void init(){memset(v,0,sizeof(v));memset(l,0,sizeof(l));memset(r,0,sizeof(r));memset(c,0,sizeof(c));}int merge(int x,int y){if(x==0||y==0) return x|y;if(v[x]>v[y]) swap(x,y);r[x]=merge(r[x],y);swap(l[x],r[x]);c[x]=c[l[x]]+c[r[x]]+1;return x;}void pop(int &x){x=merge(l[x],r[x]);c[x]=c[l[x]]+c[r[x]]+1;}int top(int x){return v[x];}
}Heap;int N,K;
int f[maxn],d[maxn];
int m[maxn],id[maxn];void dfs(int u,int& x)
{if(!u) return;x=1ll*x*Heap.v[u]%mod;dfs(Heap.l[u],x);dfs(Heap.r[u],x);
}void work()
{Heap.init();memset(d,0,sizeof(d));scanf("%d %d",&N,&K);for(int i=2;i<=N;i++){scanf("%d",&f[i]);d[f[i]]++;}for(int i=1;i<=N;i++){scanf("%d",&Heap.v[i]);m[id[i]=i]=Heap.c[i]=1;}queue<int>Q;for(int i=1;i<=N;i++) if(!d[i])Q.push(i);while(!Q.empty()){int now=Q.front();Q.pop();while(Heap.c[id[now]]>K) Heap.pop(id[now]);dfs(id[now],m[now]);id[f[now]]=Heap.merge(id[now],id[f[now]]);if(!--d[f[now]]) Q.push(f[now]);}int ans=0;for(int i=1;i<=N;i++)ans=(0ll+ans+m[i])%mod;printf("%d\n",ans);
}int main()
{int T;scanf("%d",&T);while(T--)work();return 0;
}

左偏树(XJT Love Trees,玲珑杯 Round#8 C lonlife 1081)相关推荐

  1. 《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并

    本节书摘来自华章计算机<程序设计解题策略>一书中的第1章,第1.6节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.6 利用左偏树实 ...

  2. 【洛谷3377】 左偏树(可并堆)

    前言 其实我是不小心翻线性基的时候看见的. Solution 左偏树只会模板,挖坑待补 代码实现 #include<stdio.h> #include<stdlib.h> #i ...

  3. 【学习笔记】浅谈短小可爱的左偏树(可并堆)

    文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...

  4. P3642 [APIO2016]烟火表演(左偏树、函数)

    解析 感觉是左偏树的神题了. 首先有一个比较显然的结论,一个合法的方案中,两个叶子到它们 lca\text{lca}lca 的距离必须相等. 考虑设计 dp\text{dp}dp : fi,xf_{i ...

  5. YbtOJ#631-次短路径【左偏树,最短路】

    正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/1 题目大意 给出nnn个点mmm条边的一张无向图,对于每个点iii求不经过i∼1i\sim ...

  6. P4331-[BalticOI2004]Sequence数字序列【左偏树】

    正题 题目链接:https://www.luogu.com.cn/problem/P4331 题目大意 给出一个序列aaa,求一个单调上升的序列bbb使得∑i=1n∣ai−bi∣\sum_{i=1}^ ...

  7. P1552-[APIO2012]派遣【左偏树】

    正题 题目链接:https://www.luogu.com.cn/problem/P1552 题目大意 一个nnn个点森林,每个点有价值和代价,选择一个点并在这个点的子树中选择一些点使得. 选择的点数 ...

  8. P3377-[模板]左偏树(可并堆)

    正题 题目链接:https://www.luogu.com.cn/problem/P3377 题目大意 开始时nnn个只有一个数的集合,要求支持 合并两个集合 查询一个集合中的最小值并删除 解题思路 ...

  9. HDU1512 (左偏树)

    2.1.2 可并堆的定义 可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作- ...

  10. 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]

    题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...

最新文章

  1. linux 简单dns搭建,搭建一个简易的DNS服务
  2. 人工智能下一阶段,为啥要看互联网巨头?
  3. [Embeding-2]文本表示学习-词嵌入入门理解
  4. 2 创建联合索引_想进大厂,这些Mysql索引底层知识你是必须知道的
  5. shell脚本1——变量 $、read、``
  6. spring+mybatis+springMVC+redis缓存+mysql+bootstrap+异步提交----联系人小demo
  7. C语言中的逗号操作符
  8. 子组件向父组件传值_vue父子组件传值
  9. [jquery视频教程 初级+高级][25课程]
  10. LightTools.v5.1_完整好用版本\
  11. IOI国家集训队历年论文
  12. python Flask之JinJa2
  13. html 字体图标转换工具,HTML5 webfont字体图标的使用
  14. Python 基于透明元素裁切图片(类似Photoshop)
  15. 模拟滑动android无障碍,Android无障碍简单开发-模拟滑动点击输入等
  16. 数字图像处理第三章<一>、灰度变换
  17. osg 三维gis开发_3D GIS与BIM的美丽邂逅(艾三维BIM分享)
  18. 做微商可享社保补贴?微商的市场行情发展怎么样?
  19. 第一章计算机系统基础知识,计算机系统基础知识 第一章(未完待续)
  20. 【150】设计测试用例:假设京东有一个web API:输入打折价p1和原价p0,返回折扣信息0.9,请设计测试用例进行测试

热门文章

  1. JVM性能调优(一)(JVM参数详解、内存分析等)
  2. 《大型网站技术架构-核心原理与案例分析》(李智慧 著)第3章-大型网站核心架构要素
  3. linux gbk 语言包安装,linux 安装gbk字符集
  4. Fast Walsh-Hadamard Transform (快速沃尔什变换)
  5. 这四个才是真正的低代码平台
  6. 架构师的自我修养,厉害啦
  7. Androd 基本布局(其一)
  8. 彪悍的人生不需要解释,需要解释的人生是软弱的
  9. Bundle Adjustment简述
  10. [Erlang 0075] Bad value on output port 'tcp_inet'