P4577 [FJOI2018]领导集团问题

我们对整棵树进行dfs遍历,并用一个multiset维护对于每个点,它的子树可取的最大点集。

我们遍历到点$u$时:

不选点$u$,显然答案就为它的所有子树的子集大小之和(所以答案是单调不减的)

选点$u$时,我们lower_bound一个比$val[u]$小且最接近$val[u]$的权值,用$val[u]$替换它。

为什么可以酱紫做呢

试想一下,当multiset中的元素都被替换到比点$k$的权值$val[k]$大时

这时把$val[k]$扔进去,就相当于找到了一种更优的子集取法。

虽然替换后multiset表示的子集不一定合法

但是答案单调不减(为multiset的大小)啊

所以没什么关系辣

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#define rint register int
using namespace std;
void read(int &x){
char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define N 200005
int n,v[N];
int cnt,hd[N],nxt[N],ed[N],poi[N];
multiset<int> h[N];
multiset<int>::iterator it;
inline void adde(int x,int y){
nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
ed[x]=cnt, poi[cnt]=y;
}
void merge(int x,int y){
if(h[x].size()<h[y].size()) swap(h[x],h[y]);
for(it=h[y].begin();it!=h[y].end();++it) h[x].insert(*it);
}
void dfs(int x){
for(int i=hd[x];i;i=nxt[i]) dfs(poi[i]),merge(x,poi[i]);
h[x].insert(v[x]);
it=h[x].lower_bound(v[x]);
if(it!=h[x].begin()) h[x].erase(--it);
}
int main(){
read(n);
for(rint i=;i<=n;++i) read(v[i]);
for(rint i=,f;i<=n;++i) read(f),adde(f,i);
dfs(); printf("%d",h[].size());
return ;
}

P4577 [FJOI2018]领导集团问题的更多相关文章

  1. 「题解报告」P4577 [FJOI2018]领导集团问题

    题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...

  2. 洛谷P4577 [FJOI2018]领导集团问题(dp 线段树合并)

    题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不 ...

  3. [FJOI2018]领导集团问题 mulitset合并

    P4577 [FJOI2018]领导集团问题 链接 luogu bzoj 他是个重题 bzoj4919: [Lydsy1706月赛]大根堆 代码改改就过了 思路 求树上的lis,要好好读题目的!!! ...

  4. [FJOI2018]领导集团问题

    [FJOI2018]领导集团问题 dp[i][j],i为根子树,最上面的值是j,选择的最大值 观察dp方程 1.整体Dp已经可以做了. 2.考虑优美一些的做法: dp[i]如果对j取后缀最大值,显然是 ...

  5. 【BZOJ5469】[FJOI2018]领导集团问题(动态规划,线段树合并)

    [BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等 ...

  6. 5469: [FJOI2018]领导集团问题

    5469: [FJOI2018]领导集团问题 链接 题意: 要求在一棵树内选一个子集,满足子集内的任意两个点u,v,如果u是v的祖先,那么u的权值小于等于v. 分析: dp[u][i]表示在u的子树内 ...

  7. 题解-FJOI2018 领导集团问题

    题面 FJOI2018 领导集团问题 给一棵树 \(T(|T|=n)\),每个点有个权值 \(w_i\),从中选出一个子点集 \(P=\{x\in {\rm node}|x\in T\}\),使得 \ ...

  8. 洛谷4577 & LOJ2521:[FJOI2018]领导集团问题——题解

    https://www.luogu.org/problemnew/show/P4577 https://loj.ac/problem/2521 参考:https://www.luogu.org/blo ...

  9. bzoj5469 [FJOI2018]领导集团问题

    题目描述: bz luogu 题解: 相当于树上$LIS$问题. 考虑一维情况下的贪心,我们可以用multiset启发式合并搞. 代码: #include<set> #include< ...

随机推荐

  1. [Java] Header checkBox in Jtable

    The reference is from here. 在Jtable里面我们可能会有checkbox, 而有时候我们有很多checkbox需要同时check或者同时uncheck的时候, 如果有一个 ...

  2. Linux df命令详解

    1.命令:df 2.命令功能:显示指定磁盘文件的可用空间. 3.命令参数: -a #全部文件系统列表 -h #方便阅读方式显示 -H #等于“-h”,但是计算式,1K=1000,而不是1K=1024 ...

  3. JAVA编程思想学习笔记7-chap19-21-斗之气7段

    1.枚举 2.内置三种注解 @Override @Deprecated @SuppressWarnings 3.元注解:用于注解其它注解 4.注解处理器:通过反射 5.创建线程的两种方式 实现Runn ...

  4. cocos2dx C++ imageView(图片/九宫格)相关属性大全

    ImageView * imageView = ImageView::create("cocosui/ccicon.png");//新建图片 imageView->setSc ...

  5. cocos2d-x JS 开启远程代码调试

    为了方便服务端与测试部门的工作需要,把客户端的写的程序可以在其他电脑上运行,方便他人工作与测试. 下面是cocos2d-x JS WebStorm 的设置方法.

  6. C++ 类定义

    C++ 类定义 定义一个类,本质上是定义一个数据类型的蓝图.这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作. 类定义是 ...

  7. Spring.之.jar包官网下载

    jar包官网下载 1. 官网下载网址:http://repo.spring.io/libs-release 2. 用到的jar包所在路径:org/springframework/spring/ ,在此 ...

  8. python 将文件大小转换为human readable 的大小表示

    定义了一个函数, def HRS(size):    units=('B','KB','MB','GB','TB','PB')    for i in range(len(units)-1,-1,-1 ...

  9. Unity shader学习之屏幕后期处理效果之均值模糊

    均值模糊,也使用卷积来实现,之不过卷积中每个值均相等,且相加等于1. 代码如下, 子类: using UnityEngine; public class MeanBlurRenderer : Post ...

  10. c++ 各种类型转换

    1.int 2 string 法1:c++11里面的to_string #include <string> std::); //or auto s = std::to_string(); ...