Description

给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点。每个点有一个权值v_i。
你需要将这棵树转化成一个大根堆。确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j。
请计算可选的最多的点数,注意这些点不必形成这棵树的一个连通子树。

Input

第一行包含一个正整数n(1<=n<=200000),表示节点的个数。
接下来n行,每行两个整数v_i,p_i(0<=v_i<=10^9,1<=p_i<i,p_1=0),表示每个节点的权值与父亲。

Output

输出一行一个正整数,即最多的点数。

Sample Input

6
3 0
1 1
2 1
3 1
4 1
5 1

Sample Output

5

(不)容易看出这是一个变种LIS。
如果只有一条链就是LIS。
如果多条链但是最终选的点是一条链也是个树版LIS。
然后感受一下这是个LIS。
LIS有一个经典二分做法。
现在我们用set来保存二分做法的那个数组。
不同子树之间用set来启发式合并。
然后把这个点权值丢进去替换掉第一个>=它的。
最后输出set的大小。

一棵树,每个点u有权值val[u],

要求选出最多的点,并且满足每个被选的点子树中没有权值大于等于该点权值。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define R register int
 4 #define rep(i,a,b) for(R i=a;i<=b;i++)
 5 #define Rep(i,a,b) for(R i=a;i>=b;i--)
 6 #define rp(i,x)    for(R i=H[x];i!=-1;i=E[i].nt)
 7 #define ms(i,a)    memset(a,i,sizeof(a))
 8 #define gc()       getchar()
 9 template<class T>void read(T &x){
10     x=0; char c=0;
11     while (!isdigit(c)) c=gc();
12     while (isdigit(c)) x=x*10+(c^48),c=gc();
13 }
14 int const maxn=200000+3;
15 multiset<int>  s[maxn];
16 int a[maxn],H[maxn],cnt,n;
17 struct Edge{
18     int to,nt;
19 }E[maxn];
20 void add(int a,int b){
21     E[cnt]=(Edge){b,H[a]};H[a]=cnt++;
22 }
23 void merge(int x,int y){
24     if(s[x].size()>s[y].size())  swap(s[x],s[y]);
25     multiset<int> :: iterator it=s[x].begin();
26     for( ; it!=s[x].end(); it++) s[y].insert(*it) ;
27     s[x].clear();
28 }
29 void dfs(int x){
30     rp(i,x){
31         int v=E[i].to;
32         dfs(v); merge(v,x);
33     }
34     multiset<int> :: iterator  it=s[x].lower_bound(a[x]);
35     if(it!=s[x].end()) s[x].erase(it);
36     s[x].insert(a[x]);
37 }
38 int main(){
39     read(n);
40     ms(-1,H);
41     rep(i,1,n){
42         read(a[i]);
43         int k; read(k);
44         if(k) add(k,i);
45     }
46     dfs(1);
47     printf("%d\n",s[1].size());
48     return 0;
49 }

View Code

转载于:https://www.cnblogs.com/ZJXXCN/p/10457201.html

bzoj4919 [Lydsy1706月赛]大根堆相关推荐

  1. BZOJ4919: [Lydsy1706月赛]大根堆(set启发式合并)

    题意 题目链接 Sol 如果给出的树是链的话显然就是LIS 不是链的时候直接当链做,每个节点维护一个multiset表示计算LIS过程中的单调栈 启发式合并即可 时间复杂度:$O(nlog^2n)$ ...

  2. JZOJ 5609. 【NOI2018模拟3.28】Tree BZOJ 4919: [Lydsy1706月赛]大根堆

    #Description 给你一颗有 n 个点的树,其中 1 号点为根节点,每个点都有一个权值 vali 你可以从树中选择一些点,注意如果 i 与 j 都被选中且 j 在 i 的子树内,那么必须满足 ...

  3. 【BZOJ4919】【Lydsy1706月赛】大根堆(启发式合并,DSU on tree)

    Description 给定一棵nnn个节点的有根树,编号依次为1" role="presentation" style="position: relative ...

  4. [bzoj4919] 大根堆

    [bzoj4919] 大根堆 暴力dp都会吧,多加一维记最大值,然后我们线段树合并来优化转移就行了. 代码 #include<bits/stdc++.h> using namespace ...

  5. 大根堆的删除c语言,二叉堆(一)之 C语言详解

    本文介绍二叉堆,二叉堆就是通常我们所说的数据结构"堆"中的一种.和以往一样,本文会先对二叉堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现: ...

  6. 【数据结构】堆,大根堆,小根堆,优先队列 详解

    目录 堆 1.堆的数组实现 2.小根堆 3.大根堆 4.优先队列 例题 1.SP348 EXPEDI - Expedition(有趣的贪心思路,优先队列) 2.合并果子 堆 要了解堆之前,请先了解树, ...

  7. LeetCode Find K Pairs with Smallest Sums(大根堆、小根堆)

    问题:给出两个有序数组nums1,nums2,要求从两个数组中各取一个数,组成一对数据,输出和最小的k对 思路:方法1使用大根堆,当堆中元素个数小于k时,直接入堆.否则比较当前数据对与堆顶的元素,如果 ...

  8. 哈夫曼编码之大根堆小根堆揭西县

    哈夫曼编码 根据数据出现的频率对数据进行编码,从而压缩原始数据. 例如对于一个文本文件,其中各种字符出现的次数如下: a : 10 b : 20 c : 40 d : 80 可以将每种字符转换成二进制 ...

  9. 堆排序分析(大根堆为例,由小到大排序)

    时间复杂度为O(nlogn),思路就是从最后一个非叶结点开始,依次往回遍历每个结点,将以该结点为根的子树建立成大根堆,直到遍历到整棵完全二叉树的根结点时为止,此时整棵树为大根堆. 以当前结点为根的子树 ...

最新文章

  1. shell实行mysql语句_【Mysql】shell运行mysql的sql语句_MySQL
  2. 关于spring的p标签(转)
  3. idea的setting界面怎么进_WMA转MP3怎么转?学会这招,WMA视频随便看!
  4. css3 手机信号,CSS3 无线路由器连接信号动画
  5. 解决w: pt/sources.list:18 中被配置了多次
  6. html登录界面设计代码_Python登录豆瓣并爬取影评
  7. Win10卸载python总是提示error2503失败各种解决办法
  8. 仿芒果TV微信小程序
  9. Python——装饰器的学习笔记(legacy)
  10. GTK 4.0 图形工具包正式发布
  11. 软件性能之进程优先级
  12. 科研党 篇一:完成一篇SCI论文必备的20+工具
  13. lopatkin俄大神精简中文系统Windows 10 1607 Enterprise LTSB 2016 x86-x64 ZH-CN 2x1
  14. 2013Esri全球用户大会QA之Web GIS
  15. Mac安装Docker及使用
  16. 免安装PortableGit配置 + TortoiseGit安装
  17. Linux系统重设开机秘码-------忘记linux开机密码
  18. Java中的String类为什么不可变
  19. HDOJ 1282 回文数猜想
  20. 汇编原理自我总结(一)

热门文章

  1. Ehab and another construction problem(水题)
  2. 依赖插件版本冲突问题
  3. html5 formdata api,HTML5 API FormData --- 使用
  4. python xlwt模块使用_Python xlwt模块使用代码实例
  5. CodeForces - 1102A(思维题)
  6. [机器学习] XGBoost 自定义损失函数-FocalLoss
  7. js模块化之模块依赖处理
  8. 【TensorRT】将 PyTorch 转化为可部署的 TensorRT
  9. 如何批量转.jpg/.bmp图片
  10. 深入浅出SQL(1)