[bzoj4919] 大根堆


暴力dp都会吧,多加一维记最大值,然后我们线段树合并来优化转移就行了。

  • 代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
const int NN=6e6+5;
int fa[N],val[N],root[N];
int lch[NN],rch[NN],mx[NN],lzy[NN],cnt,n;
inline void pushdown(int x){if(!x||!lzy[x])return;mx[x]+=lzy[x];if(lch[x])lzy[lch[x]]+=lzy[x];if(rch[x])lzy[rch[x]]+=lzy[x];lzy[x]=0;
}
inline int merge(int rt1,int rt2,int plul,int plur){pushdown(rt1);pushdown(rt2);if(!rt1||!rt2){if(!rt1) lzy[rt2]=plul;else lzy[rt1]=plur;return rt1|rt2;}if(!lch[rt1]&&!lch[rt2]&&!rch[rt1]&&!rch[rt2]){mx[rt1]=max(max(mx[rt1]+plur,mx[rt2]+plul),mx[rt1]+mx[rt2]);return rt1;}pushdown(lch[rt1]);pushdown(lch[rt2]);int nwplul=max(plul,mx[lch[rt1]]);int nwplur=max(plur,mx[lch[rt2]]);lch[rt1]=merge(lch[rt1],lch[rt2],plul,plur);rch[rt1]=merge(rch[rt1],rch[rt2],nwplul,nwplur);pushdown(lch[rt1]);pushdown(rch[rt1]);mx[rt1]=max(mx[lch[rt1]],mx[rch[rt1]]);return rt1;
}inline void update(int &rt,int l,int r,int val,int sum){int mid=(l+r)>>1;if(!rt)rt=++cnt;pushdown(rt);if(l==r){mx[rt]=max(mx[rt],sum+1);return;}if(val>mid){pushdown(lch[rt]);sum=max(mx[lch[rt]],sum);update(rch[rt],mid+1,r,val,sum);}else update(lch[rt],l,mid,val,sum);pushdown(lch[rt]);pushdown(rch[rt]);mx[rt]=max(mx[lch[rt]],mx[rch[rt]]);
}
pair<int,int> a[N];
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&val[i],&fa[i]);a[i]=make_pair(val[i],i);}sort(a+1,a+n+1);int cont=0;for(int i=1;i<=n;i++){if(i==1||a[i].first!=a[i-1].first)++cont;val[a[i].second]=cont;}for(int i=n;i;i--){update(root[i],1,cont,val[i],0);pushdown(root[i]);if(fa[i])root[fa[i]]=merge(root[fa[i]],root[i],0,0);}pushdown(root[1]);printf("%d\n",mx[root[1]]);
}

[bzoj4919] 大根堆相关推荐

  1. bzoj4919 大根堆

    考虑二分求序列LIS的过程. g[i]表示长度为i的LIS最小以多少结尾. 对于每个数,二分寻找插入的位置来更新g数组. 放到树上也是一样,额外加上一个合并儿子的过程. 发现儿子与儿子直接是互不影响的 ...

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

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

  3. bzoj4919 [Lydsy1706月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

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

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

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

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

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

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

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

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

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

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

  9. python实现二叉堆中的大顶堆(大根堆)

    堆(英语:heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: 堆中某个节点的值总是不大于或不小于其父节点的值: 堆总是一棵完全二叉树. 将根 ...

最新文章

  1. 网络安全比赛理论答题(五)
  2. SharePoint Framework 企业向导(九)
  3. 分布式系统概念 | 分布式锁:数据库、Redis、Zookeeper解决方案
  4. 荣耀6plus+android5.1,荣耀66Plus EMUI3.0开发版5.5.1版本发布说明
  5. 机器学习实战(十四)Pegasos(原始估计子梯度求解器)
  6. 吴恩达机器学习【第四天】多元线性规划模型
  7. XJTUOJ wmq的队伍(树状数组求 K 元逆序对)
  8. 捡来的一个大数模版。很好用
  9. 在Mac上刻录DVD
  10. [Unity][摄像机]动态代码设置Camera的CullingMask遮罩
  11. android-常用部件
  12. 多浏览器支持ActiveX控件
  13. 服务器打印后台程序没有响应,Win10提示打印后台处理程序服务没有运行如何解决...
  14. 苹果手机指纹识别坏了怎么办?维修需要多少钱?
  15. 测试用例 测试的方法
  16. 技术干货 | Linkis实践:新引擎实现流程解析
  17. Markdown极简教程
  18. 【故障解决】ORA-06502错误解决
  19. 正则表达式贪婪模式、懒惰模式与独占模式浅析
  20. usaco4.4.1 Shuttle Puzzle

热门文章

  1. 【OpenCV】透视变换应用——实现鸟瞰图与贴图
  2. 无向图生成树计数 -- Kirchhoff 矩阵法模板
  3. CISAW认证考试,一文详解
  4. 新员工转正申请书如何写呢?工作转正申请书范文分享
  5. 运维发布系统原型设计
  6. python画鸟_菜鸟世界 -使用python制作一张字符画
  7. C/C++中结构体和类的区别
  8. 哈尔滨工程大学计算机学院研究生推免细则,哈尔滨工程大学2018招收推荐免试研究生办法...
  9. 翻译: 给有野心的19岁少年的建议——Sam Altman
  10. 脚本录制软件python 按键精灵 tc_键鼠录制工具(KeymouseGo)