首页 > 其他分享 >P3780 苹果树 题解

P3780 苹果树 题解

时间:2024-11-02 09:42:26浏览次数:4  
标签:结点 le 题解 P3780 苹果 苹果树 dfn nk dp

传送门

夏天近了,又到了恋爱的季节,小Q家门前的苹果树上结满了红红圆圆的苹果。

这株苹果树是一个有着\(n\)个结点的有根树,其中结点被依次编号为\(1\)至\(n\)。\(1\)号结点为根,其余每一个结点的父结点一定是某个编号较小的结点。每一个结点上都有一些苹果,第\(i\)个结点上有\(a_i (a_i > 0)\)个苹果,每取走其中一个苹果就可以得到\(v_i (v_i > 0)\)的幸福度(若在这个结点取走\(k \leq a_i\)个苹果,则可以收获\(kv_i\)的幸福度)。如果在一个结点取走了至少一个苹果,则必须要在其父结点处取走至少一个苹果。

现在,给定正整数\(k\),请从树上取走若干苹果。如果总计取走了\(t\)个苹果,且所有取了至少一个苹果的那些结点的最大深度为\(h\)(这里规定根结点的深度为\(1\)),则要求\(t-h \leq k\)。问最大可以收获多少的幸福度?(这些幸福度全都归属于恋爱中的小Q。)

多组数据,\(T\le 5,n\le 2\times 10^4,k\le 5\times 10^5,nk\le 25\times 10^6,a_i\le 10^8,v_i\le 100\)。


选一个包含根的连通块,\(t-h\le k\),最大价值。算法明显是 \(O(nk)\) 的。

【简化版】

因为 \(t-h\le k\) 这个条件过于阴间了,尝试解决简化版 \(t\le k\)。

【\(a_v=1\)】

即使是简化版,也先考虑解决 \(a_v=1\) 的特殊情况。这种情况,每个结点只有选和不选两种情况。

采用 dfn 序 DP。\(dp[i][j]\) 表示目前考虑完 \(dfn\le i-1\) 的结点(\(i\) 待定),已经选了 \(j\) 个结点,且强制 \(i\) 的祖先们都选了,最大权值是多少。

刷表法转移,考虑 \(i\) 选不选。若 \(i\) 选,转移到 \(dp[i+1][j+1]\);若 \(i\) 不选,记 \(big[x]\) 为 \(x\) 子树中 dfn 的最大值,转移到 \(dp[big[i]+1][j]\)。

答案取 \(\max dp[n+1][0\sim n]\)。状态 \(O(nk)\),转移 \(O(1)\),总共 \(O(nk)\) 的复杂度。

【\(a_v\) 任意】

然后解决简化版的一般情况。状态描述不变,考虑怎么优化转移过程。

先考虑朴素的转移是怎么做的。若选 \(0\) 个,转移到 \(dp[big[i]+1][j]\);否则 \(dp[i][j]+w_i\times c\rightarrow dp[i+1][j+c]\),要求 \(c\ge 1\)。

不选的情况不用动,只需要优化选的情况。

令 \(g_j=\max_{1\le j-c\le a_i,c\ge 1}\{dp[i][c]+w_i\cdot (j-c)\}=w_i\cdot j+\max_{1\le j-c\le a_i,c\ge 1} dp[i][c]-w_i\cdot c\)。把 \(dp[i][c]-w_i\cdot c\) 视作 \(f[c]\),就是经典的滑动窗口问题,可以 \(O(k)\) 求出 \(g_0\sim g_k\)。
然后用 \(g_k\) 转移 \(dp[i+1][k]\)。

还是 \(O(nk)\) 的。

【原版】

\(h\) 可以看作是 "允许让一条链上的点免费取一个"。

【\(a_v=1\)】

新建一个 dfn2 序,和上面的 dfn 对儿子的访问顺序完全相反。然后新建一个 \(dp2[][]\) 按照 dfn2 的顺序 DP,状态定义和 \(dp[][]\) 一样。

在求出两个数组之后,枚举结点 \(v\) 为 "免费链" 的最下端结点,枚举 \(j1\) 为 "dfn 比 \(v\) 小的选的个数",\(dp[v][j1]+dp2[v][j2]+w_v\) 即为 \(v\) 的最大可能贡献。其中 \(j2\) 满足 \(j1-(d[v]-1)+j2-(d[v]-1)=k\)。
之所以加上 \(w_v\),是因为两个状态定义里 \(v\) 都是待定的,所以在最后把这个免费的 \(v\) 的权值加上。

【\(a_v\) 任意】

这里不能按上面做的原因,是 \(v\) 的祖先可以选不止一个,在 \(dp[v]\) 中是一种选法,在 \(dp2[v]\) 中又是不同的选法,情况不同当然不能直接合并。

那能不能让 \(v\) 的祖先的 \(a=1\) 呢?就相当于除了叶子结点的 \(a\) 都等于 \(1\)。

事实上是可以的,我们拆点,若 \(a_i>1\),给 \(i\) 额外拆出一个结点 \(new\) 作为儿子,\(a[new]=a[i]-1,w[new]=w[i]\) 然后 \(a[i]\leftarrow 1\)。这是等价的。


题解区第一篇是按照后序遍历的 dfn 写的,本质相同。

标签:结点,le,题解,P3780,苹果,苹果树,dfn,nk,dp
From: https://www.cnblogs.com/FLY-lai/p/18521146

相关文章

  • 【轰炸题解】
    轰炸题目描述“我该怎么办?”飞行员klux向你求助。事实上,klux面对的是一个很简单的问题,但是他实在太菜了。klux要想轰炸某个区域内的一些地方,它们是位于平面上的一些点,但是(显然地)klux遇到了抵抗,所以klux只能飞一次,而且由于飞机比较破,一点起飞就只能沿直线飞行,无法......
  • Codeforces Round 983 div2 个人题解(A~D)
    CodeforcesRound983div2个人题解(A~D)Dashboard-CodeforcesRound983(Div.2)-Codeforces火车头#define_CRT_SECURE_NO_WARNINGS1#include<algorithm>#include<array>#include<bitset>#include<cassert>#include<cmath>#in......
  • SP30785 ADAAPPLE - Ada and Apple 题解
    洛谷题目传送门博客园可能食用更佳题目大意:给定一棵权值为\(0\)或\(1\)的树,\(n\)个点,\(q\)次操作:0i把结点\(i\)的权值取反;1ij询问点\(i\)到点\(j\)的最短路径上权值是否全为\(0\)或全为\(1\)。题目分析:树上操作,看了下操作发现是树剖板子题。开......
  • P5298 Minimax 题解
    传送门小\(C\)有一棵\(n\)个结点的有根树,根是\(1\)号结点,且每个结点最多有两个子结点。定义结点\(x\)的权值为:1.若\(x\)没有子结点,那么它的权值会在输入里给出,保证这类点中每个结点的权值互不相同。2.若\(x\)有子结点,那么它的权值有\(p_x\)的概率是它的子结点......
  • AT_utpc2012_07 k番目の文字列 题解
    模拟赛搬了这个题,来写个题解。\(n\)这么小,不是状压就是很多很多维DP(暴论)。状压我没想出来,那就正常DP。考虑依次填入字符串的每个位置,记\(f(i,j,num,op)\)表示填了前\(i\)个位置,其中比\(s_0\)小的有\(j\)个,目前字典序比\(s\)小的子串有\(num\)个的方案数,\(op\)表......
  • 天津大学2024华为杯I.个大的大个 题解
    原题链接https://acm.tju.edu.cn/problem/P2040学校oj好像挂了,题解发不出去,又没有草稿功能,所以先存在这里了。前言华为杯时候对字符串不太熟,加上看错题了导致没做出这题,很可惜,苦练几个月,现在已经成为串串大师,回过头来秒一下这题发个题解泄恨。题意给定一个长为\(n\)的字符......
  • 2024御网线上Pwn方向题解
    ASMChecksec检查保护基本上保护都关闭了64位ida逆向程序只有一段,并且返回地址就是输入的数据,看起来就是srop了,找一下可以用的gadget通过异或清空rax值,然后通过异或ecx和1,异或rax和rcx即可增加rax的值,同理左移一位同样可以增加rax的值,将rax增加到0xf然后打srop,程序还给出了......
  • CodeForces Dora and C++ (2007C) 题解
    CodeForcesDoraandC++(2007C)题解题意给一个数组\(c_{1...n}\),定义数组的\(range\)是最大值减最小值,即极差。给出两个值\(a\)和\(b\),每步操作中,可给数组中任一一个数增大\(a\)或增大\(b\)。问任意步操作后(可以是\(0\)步),极差的最小值。思路(要直接看答案可以跳......
  • 第八届御网杯线下赛Pwn方向题解
    由于最近比赛有点多,而且赶上招新,导致原本应该及时总结的比赛搁置了,总结来说还是得多练,因为时间很短像这种线下赛,一般只有几个小时,所以思路一定要清晰,我还是经验太少了,导致比赛力不从心,先鸽了~Skillchecksec检查保护(没有开PIE和Canary)ida逆向分析一下不同的选项对应不同的功......
  • 【考试题解】多校A层冲刺NOIP2024模拟赛17
    A.网格(grid)题目内容给你一个\(n\timesm\)的字符网格\(s\),\(s_{i,j}\in[1,9]\cup\{+,*\}\),从\((1,1)\)开始,仅向下或向右走并最终到达\((n,m)\)的路径被称为合法路径,求所有合法路径对应的表达式的运算结果之和,答案对\(998244353\)取模。部分分44pts爆搜,枚举路径,......