左偏树(XJT Love Trees,玲珑杯 Round#8 C lonlife 1081)
就是容易想到维护每个节点的优先队列啦,优先队列的长度为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.6 利用左偏树实现优先队列的合并
本节书摘来自华章计算机<程序设计解题策略>一书中的第1章,第1.6节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.6 利用左偏树实 ...
- 【洛谷3377】 左偏树(可并堆)
前言 其实我是不小心翻线性基的时候看见的. Solution 左偏树只会模板,挖坑待补 代码实现 #include<stdio.h> #include<stdlib.h> #i ...
- 【学习笔记】浅谈短小可爱的左偏树(可并堆)
文章目录 左偏树 左偏树的合并(merge)操作 例题 罗马游戏 [Apio2012]dispatching [JLOI2015]城池攻占 [Baltic2004]sequence 左偏树 左偏树是一 ...
- P3642 [APIO2016]烟火表演(左偏树、函数)
解析 感觉是左偏树的神题了. 首先有一个比较显然的结论,一个合法的方案中,两个叶子到它们 lca\text{lca}lca 的距离必须相等. 考虑设计 dp\text{dp}dp : fi,xf_{i ...
- YbtOJ#631-次短路径【左偏树,最短路】
正题 题目链接:https://www.ybtoj.com.cn/contest/114/problem/1 题目大意 给出nnn个点mmm条边的一张无向图,对于每个点iii求不经过i∼1i\sim ...
- P4331-[BalticOI2004]Sequence数字序列【左偏树】
正题 题目链接:https://www.luogu.com.cn/problem/P4331 题目大意 给出一个序列aaa,求一个单调上升的序列bbb使得∑i=1n∣ai−bi∣\sum_{i=1}^ ...
- P1552-[APIO2012]派遣【左偏树】
正题 题目链接:https://www.luogu.com.cn/problem/P1552 题目大意 一个nnn个点森林,每个点有价值和代价,选择一个点并在这个点的子树中选择一些点使得. 选择的点数 ...
- P3377-[模板]左偏树(可并堆)
正题 题目链接:https://www.luogu.com.cn/problem/P3377 题目大意 开始时nnn个只有一个数的集合,要求支持 合并两个集合 查询一个集合中的最小值并删除 解题思路 ...
- HDU1512 (左偏树)
2.1.2 可并堆的定义 可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),还支持一个额外的操作- ...
- 洛谷P3273 [SCOI2011] 棘手的操作 [左偏树]
题目传送门 棘手的操作 题目描述 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 ...
最新文章
- linux 简单dns搭建,搭建一个简易的DNS服务
- 人工智能下一阶段,为啥要看互联网巨头?
- [Embeding-2]文本表示学习-词嵌入入门理解
- 2 创建联合索引_想进大厂,这些Mysql索引底层知识你是必须知道的
- shell脚本1——变量 $、read、``
- spring+mybatis+springMVC+redis缓存+mysql+bootstrap+异步提交----联系人小demo
- C语言中的逗号操作符
- 子组件向父组件传值_vue父子组件传值
- [jquery视频教程 初级+高级][25课程]
- LightTools.v5.1_完整好用版本\
- IOI国家集训队历年论文
- python Flask之JinJa2
- html 字体图标转换工具,HTML5 webfont字体图标的使用
- Python 基于透明元素裁切图片(类似Photoshop)
- 模拟滑动android无障碍,Android无障碍简单开发-模拟滑动点击输入等
- 数字图像处理第三章<一>、灰度变换
- osg 三维gis开发_3D GIS与BIM的美丽邂逅(艾三维BIM分享)
- 做微商可享社保补贴?微商的市场行情发展怎么样?
- 第一章计算机系统基础知识,计算机系统基础知识 第一章(未完待续)
- 【150】设计测试用例:假设京东有一个web API:输入打折价p1和原价p0,返回折扣信息0.9,请设计测试用例进行测试
热门文章
- JVM性能调优(一)(JVM参数详解、内存分析等)
- 《大型网站技术架构-核心原理与案例分析》(李智慧 著)第3章-大型网站核心架构要素
- linux gbk 语言包安装,linux 安装gbk字符集
- Fast Walsh-Hadamard Transform (快速沃尔什变换)
- 这四个才是真正的低代码平台
- 架构师的自我修养,厉害啦
- Androd 基本布局(其一)
- 彪悍的人生不需要解释,需要解释的人生是软弱的
- Bundle Adjustment简述
- [Erlang 0075] Bad value on output port 'tcp_inet'