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]领导集团问题的更多相关文章
- 「题解报告」P4577 [FJOI2018]领导集团问题
题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降 ...
- 洛谷P4577 [FJOI2018]领导集团问题(dp 线段树合并)
题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不 ...
- [FJOI2018]领导集团问题 mulitset合并
P4577 [FJOI2018]领导集团问题 链接 luogu bzoj 他是个重题 bzoj4919: [Lydsy1706月赛]大根堆 代码改改就过了 思路 求树上的lis,要好好读题目的!!! ...
- [FJOI2018]领导集团问题
[FJOI2018]领导集团问题 dp[i][j],i为根子树,最上面的值是j,选择的最大值 观察dp方程 1.整体Dp已经可以做了. 2.考虑优美一些的做法: dp[i]如果对j取后缀最大值,显然是 ...
- 【BZOJ5469】[FJOI2018]领导集团问题(动态规划,线段树合并)
[BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等 ...
- 5469: [FJOI2018]领导集团问题
5469: [FJOI2018]领导集团问题 链接 题意: 要求在一棵树内选一个子集,满足子集内的任意两个点u,v,如果u是v的祖先,那么u的权值小于等于v. 分析: dp[u][i]表示在u的子树内 ...
- 题解-FJOI2018 领导集团问题
题面 FJOI2018 领导集团问题 给一棵树 \(T(|T|=n)\),每个点有个权值 \(w_i\),从中选出一个子点集 \(P=\{x\in {\rm node}|x\in T\}\),使得 \ ...
- 洛谷4577 & LOJ2521:[FJOI2018]领导集团问题——题解
https://www.luogu.org/problemnew/show/P4577 https://loj.ac/problem/2521 参考:https://www.luogu.org/blo ...
- bzoj5469 [FJOI2018]领导集团问题
题目描述: bz luogu 题解: 相当于树上$LIS$问题. 考虑一维情况下的贪心,我们可以用multiset启发式合并搞. 代码: #include<set> #include< ...
随机推荐
- Mybatis中映射器实现方式总结
一种是通过XML文件方式(由一个java接口和一个XML文件构成) RoleMapper rm = session.getMapper(RoleMapper.class); List<Role& ...
- network error:software caused connection abort
使用Putty链接阿里云香港服务器报这个错误. vim /etc/ssh/sshd_config 找到如下配置 #ClientAliveInterval 540 #ClientAliveCountMa ...
- bat脚本简单命令
1.if 判断 (1.1)判断字符串是否为空: if "%var1%" == " " ( echo null) else(echo not null ) (1. ...
- python-selenium无法调用浏览器的问题
一直有这个问题 问题:selenim不能调用浏览器 File "/Users/ligaijiang/PycharmProjects/Runoob/venv/lib/python3.7/sit ...
- asp.net拦截器
一 拦截器又称过滤器. asp.net mvc本身是自带3种拦截器:Action拦截器.Result拦截器.Exception拦截器. 应用中常见的拦截器有日志拦截器(Action拦截器)和异常处理拦 ...
- unity3d-游戏实战突出重围,第四天 添加角色
1:添加unity自带的第一人称角色控制器,命名为hreo 2:添加第三人称角色控制器.这里是添加源文件Sources下面的.如箭头指示:而不是“3rd Person Controller”.并命名为 ...
- 多表关联查询_resultMap_集合对象
多表关联查询_resultMap_集合对象_N+1方式实现 package com.bjsxt.mapper; import java.util.List; import com.bjsxt.pojo ...
- DoTween
dotween最原始的用法 using System.Collections; using System.Collections.Generic; using UnityEngine; using D ...
- 点击地面时,若鼠标点击的偶数次使得Cube向点击点移动,并且点击奇数次Cube变色
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ray10 : ...
- C#什么时候需要使用构造函数
只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就需要调用默认构造函数.除非类是 static 的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例 ...