BZOJ 4919 (树上LIS+启发式合并)
题面
给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点。每个点有一个权值v_i。
你需要将这棵树转化成一个大根堆。确切地说,你需要选择尽可能多的节点,满足大根堆的性质:对于任意两个点i,j,如果i在树上是j的祖先,那么v_i>v_j。
请计算可选的最多的点数,注意这些点不必形成这棵树的一个连通子树。
分析
由于点不需要相邻,此题其实是树上的LIS,从叶子节点向根节点形成LIS
考虑LIS的\(O(nlogn)\)算法中用到的数组,用multiset对每个节点维护这样一个数组,存储子树内的值
向上的同时合并两个multiset,用启发式合并
时间复杂度应该是\(O(nlog^2n)\)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#define maxn 200005
using namespace std;
int n;
struct edge{
int from;
int to;
int next;
}E[maxn<<1];
int head[maxn];
int sz;
void add_edge(int u,int v){
sz++;
E[sz].from=u;
E[sz].to=v;
E[sz].next=head[u];
head[u]=sz;
}
int a[maxn];
multiset<int>s[maxn];
void merge(int x,int y){//启发式合并
if(s[x].size()<s[y].size()) swap(s[x],s[y]);
for(multiset<int>::iterator it=s[y].begin();it!=s[y].end();it++){
s[x].insert(*it);
}
}
void dfs(int x,int fa){
for(int i=head[x];i;i=E[i].next){
int y=E[i].to;
if(y!=fa){
dfs(y,x);
merge(x,y);
}
}
multiset<int>::iterator it=s[x].lower_bound(a[x]);
if(it==s[x].end()) s[x].insert(a[x]);
else{
s[x].erase(it);
s[x].insert(a[x]);
}
}
int main(){
int fa;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&a[i],&fa);
if(fa!=0){
add_edge(i,fa);
add_edge(fa,i);
}
}
dfs(1,0);
printf("%d\n",s[1].size());
}
BZOJ 4919 (树上LIS+启发式合并)的更多相关文章
- Special Segments of Permutation - CodeForces - 1156E (笛卡尔树上的启发式合并)
题意 给定一个全排列\(a\). 定义子区间\([l,r]\),当且仅当\(a_l + a_r = Max[l,r]\). 求\(a\)序列中子区间的个数. 题解 笛卡尔树上的启发式合并. \(200 ...
- BZOJ 3123 主席树 启发式合并
思路: 主席树 搞树上的k大 x+y-lca(x,y)-fa(lca(x,y)) 按照size小树往大树上插 启发式合并 n*log^2n的 搞定~ //By SiriusRen #include & ...
- BZOJ.3510.首都(LCT 启发式合并 树的重心)
题目链接 BZOJ 洛谷 详见这. 求所有点到某个点距离和最短,即求树的重心.考虑如何动态维护. 两棵子树合并后的重心一定在两棵树的重心之间那条链上,所以在合并的时候用启发式合并,每合并一个点检查sz ...
- BZOJ 3123 [SDOI2013] 森林 - 启发式合并 主席树
Description 给你一片森林, 支持两个操作: 查询$x$到$y$的$K$大值, 连接两棵树中的两个点 Solution 对每个节点$x$动态开权值线段树, 表示从$x$到根节点路径上权值出 ...
- 【csp模拟赛6】树上统计-启发式合并,线段树合并
30%:暴力 40%:枚举L,R从L~n枚举,R每增大一个,更新需要的边(bfs实现)60%:枚举每条边, 计算每条边的贡献另外20%的数据:枚举每条边,计算每条边的贡献100%:对于每一条边统计 有 ...
- BZOJ 3545: [ONTAK2010]Peaks 启发式合并 + 离线 + Splay
Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询 ...
- Codeforces 1009 F. Dominant Indices(长链剖分/树上启发式合并)
F. Dominant Indices 题意: 给一颗无向树,根为1.对于每个节点,求其子树中,哪个距离下的节点数量最多.数量相同时,取较小的那个距离. 题目: 这类题一般的做法是树上的启发式合并,复 ...
- bzoj 4919 [Lydsy1706月赛]大根堆 set启发式合并+LIS
4919: [Lydsy1706月赛]大根堆 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 599 Solved: 260[Submit][Stat ...
- BZOJ 4919: [Lydsy1706月赛]大根堆 set启发式合并
这个和 bzoj 5469 几乎是同一道题,但是这里给出另一种做法. 你发现你要求的是一个树上 LIS,而序列上的 LIS 有一个特别神奇的 $O(n\log n) $ 做法. 就是维护一个单调递增的 ...
随机推荐
- 配置本地yum仓库
前言 我们知道yum工具是基于rpm的,其一个重要的特性就是可以自动解决依赖问题,但是yum的本质依旧是把后缀名.rpm的包下载到本地,然后按次序安装之.但是每次执行yum install x ...
- 【leetcode】1154. Day of the Year
题目如下: Given a string date representing a Gregorian calendar date formatted as YYYY-MM-DD, return the ...
- 安装VS2017
www.visualstudio.com/zh-hans/downloads/ https://visualstudio.microsoft.com/zh-hans/thank-you-downloa ...
- Activiti7入门(五)
1 创建流程 首先选中存放图形的目录(本次我们选择 resources 下的 bpmn 目录),点击菜单: New-BpmnFile,如下图所示: 起完名字 holiday 后(默认扩展名为 bpmn ...
- php 单示例编程
<?php defined('SYSPATH') or die('No direct script access.'); class Kohana_BOTA { //私有构造方法,防止再次实例化 ...
- EF 查询时,返回其中一张表(省掉一个个写字段的麻烦)
1.使用partial将需要添加的字段进行扩展 public partial class T_OrderInfo { public string EntName { get; set; } } 2.使 ...
- ASP.NET MVC 下拉的使用(ViewData传递)
C#部分 public void GetViewData() { List<string> data = new List<string>(); data.Add(" ...
- 一台电脑多个git使用 push 时候出现denied
http://my.oschina.net/silentboy/blog/220158 当一台电脑上多个git account 的时候, 出现如下问题, $ git push origin maste ...
- WIN7系统JavaEE(java+tomcat7+Eclipse)环境配置
https://jingyan.baidu.com/article/3a2f7c2e62d25e26afd611fa.html WIN7系统JavaEE(java+tomcat7+Eclipse)环境 ...
- Asynchronous module definition
Asynchronous module definition Asynchronous module definition (AMD) is a specification for the progr ...