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

5469: [FJOI2018]领导集团问题 链接 题意: 要求在一棵树内选一个子集,满足子集内的任意两个点u,v,如果u是v的祖先,那么u的权值小于等于v. 分析: dp[u][i]表示在u的子树内,最大的数是i的时候,最多选多少点.其中每个i都要和i+1取max,即每个i维护后缀最大值. 考虑优化:如果不考虑u的权值,对dp数组从后往前差分,然后得到的一定全是正数,而且此时的差分数组就是所有子节点的差分数组的和(即把每一位上的数字求和). 而合并差分数组是可以做到$O(nlogn)$的,因为…
在 dp 问题中,如果发现可以用后缀最大值来进行转移的话可以考虑去查分这个后缀最大值. 这样的话可以用差分的方式来方便地进行维护 ~ #include <bits/stdc++.h> #define N 200007 #define ll long long #define lson t[x].ls #define rson t[x].rs #define setIO(s) freopen(s".in","r",stdin) using namespac…
[FJOI2018]领导集团问题 dp[i][j],i为根子树,最上面的值是j,选择的最大值 观察dp方程 1.整体Dp已经可以做了. 2.考虑优美一些的做法: dp[i]如果对j取后缀最大值,显然是不上升的分段函数 而段数就是子树sz 树形Dp的时候,子树之间可以直接把分段函数按位相加.对于<=w[x]的,可以额外获得从dp[i][w[x]]+1得到的转移 1.用map维护,启发式合并,但是合并整体加上一些数不能维护具体值,所以维护差分值! 2.额外转移,找到前驱p,p+1到w[x]整体+1,…
P4577 [FJOI2018]领导集团问题 链接 luogu bzoj 他是个重题 bzoj4919: [Lydsy1706月赛]大根堆 代码改改就过了 思路 求树上的lis,要好好读题目的!!! 类似于一条链子的思路,把大于w[u]的改掉 代码 #include <bits/stdc++.h> using namespace std; const int N=2e5+7; int read() { int x=0,f=1;char s=getchar(); for(;s>'9'||s…
[BZOJ5469][FJOI2018]领导集团问题(动态规划,线段树合并) 题面 BZOJ 洛谷 题解 题目就是让你在树上找一个最大的点集,使得两个点如果存在祖先关系,那么就要满足祖先的权值要小于等于儿子的权值. 首先离散权值. 考虑一个暴力\(dp\),设\(f[i][j]\)表示以\(i\)为根,子树中被选择的最小值为\(j\)时能够被选出的最大点树.然后xjb转移一下就写出了一个\(O(n^3)\)的优秀做法. 然后把状态从恰好变成至少,然后就得到了一个\(O(n^2)\)的做法. 考虑…
P4577 [FJOI2018]领导集团问题 我们对整棵树进行dfs遍历,并用一个multiset维护对于每个点,它的子树可取的最大点集. 我们遍历到点$u$时: 不选点$u$,显然答案就为它的所有子树的子集大小之和(所以答案是单调不减的) 选点$u$时,我们lower_bound一个比$val[u]$小且最接近$val[u]$的权值,用$val[u]$替换它. 为什么可以酱紫做呢 试想一下,当multiset中的元素都被替换到比点$k$的权值$val[k]$大时 这时把$val[k]$扔进去,…
题面 FJOI2018 领导集团问题 给一棵树 \(T(|T|=n)\),每个点有个权值 \(w_i\),从中选出一个子点集 \(P=\{x\in {\rm node}|x\in T\}\),使得 \(\forall u,v\in P,v\in{u{\rm 's\ subtree}}\) 满足 \(w_v\ge w_u\),求 \(|P|_{\max}\). 数据范围:\(1\le n\le 2\cdot 10^5\),\(0<w_i\le 10^9\). 蒟蒻解 这里是线段树合并维护 \(\r…
题解 P4577 [FJOI2018]领导集团问题 题解区好像没有线段树上又套了二分的做法,于是就有了这片题解. 题目传送门 怀着必 WA 的决心交了两发,一不小心就过了. 题意 求一个树上最长不下降子序列. 思路 首先考虑裸的 dp:设 \(f_{u,j}\) 表示以 \(u\) 为根的子树里选的数的最大值不小于 \(j\) 能选多少个. \[f_{u,j}= \begin{cases} \sum_\limits{v\ is\ u's\ son}f_{v,j} &j>w_u\\ \max\…
题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不升的,那么我们可以维护他的差分数组(两个差分数组相加再求和 与 对两个原数组直接求和是一样的) 向上合并的过程中对\(a[x]\)处\(+1\),再找到\(a[x]\)之前为\(1\)的位置\(-1\)即可 (怎么感觉暴力区间加也可以qwq) 复杂度\(O(nlogn)\) // luogu-jud…
https://www.luogu.org/problemnew/show/P4577 https://loj.ac/problem/2521 参考:https://www.luogu.org/blog/ShadowassIIXVIIIIV/solution-p4577 自己再说下另一种理解方法吧. 我们设f[i][j]为i的子树下找到的点集最小值为j的大小. 但不是很好统计,所以我们开f[i][j]表示j~INF的和即为原来的含义. 则我们合并其子树的时候,考虑加入i的w[i]时,其答案f[i…