B. Fake Plastic Trees(贪心+dp)

简介: B. Fake Plastic Trees(贪心+dp)

题目

(Fake Plastic Trees)[codeforces.com/problemset/…]

题意

输入 T(≤1e3) 表示 T 组数据。所有数据的 n 之和 ≤2e5。 每组数据输入 n(2≤n≤2e5) 表示一棵 n 个节点的树,编号从 1 开始,1 为根节点。 然后输入 p[2],p[3],...,p[n],其中 p[i] 表示 i 的父节点。 然后输入 n 行,其中第 i 行输入两个数 l 和 r,表示第 i 个节点值的目标范围 [l,r]。

初始时,所有节点值均为 0。 每次操作你可以选择一条从 1 开始的路径,把路径上的每个节点值都加上一个数。要求这些数按照路径的顺序,形成一个递增序列。(可以相等,可以等于 0,例如 [0,0,1,3,3]) 要使所有节点值都在对应的范围内,至少要操作多少次?

思路

先满足叶子节点,这样肯定是最优的。

在满足叶子的情况下,因为是非递减序列,所以让序列尽量大也是最优的

设dp[u]为操作数最少的情况下,满足子树后,u节点能得到的最大权重。

dp[u]=min(∑u子节点vdp[v],R[u])dp[u] = min(\sum_{u子节点v} dp[v],R[u])dp[u]=min(u子节点vdp[v],R[u])

代码

cpp

复制代码

const int N = 2e5+10;
vector<int> p[N];
int L[N],R[N];
int ans = 0;
LL dfs(int u)
{
    LL sum = 0;
    for(auto v:p[u])
    {
        sum += dfs(v);
    }
    if (sum < L[u])sum = R[u],ans ++;
    return min(sum,1LL*R[u]);
}
void solve()
{
    ans = 0;
    int n;cin >> n;
    for(int i = 1;i <= n;i ++)p[i].clear();
    for(int i = 2;i <= n;i ++){
        int t;cin >> t;
        p[t].push_back(i);
    }
    for(int i = 1;i <= n;i ++)cin >> L[i] >> R[i];
    dfs(1);
    cout << ans << endl;
}
相关文章
|
6月前
Leetcode 368. Largest Divisible Subset思路及详解
这里有个很简单的数学性质,就是整除的传递性,如果a%b==0 且 b%c == 0,那么a%c == 0,说白了如果c是b的因子,b又是a的因子,那么c肯定是a的因子。这样我们就可以在数组中找出很多整除链(a->b->c->d,其中b是a的因子,c是b的因子,d是c的因子),这样的链条就满足两两整除的条件,题目就变成了求最长的链条。 先上代码,然后我再解释下我的代码。
25 0
|
6月前
Leetcode 74. Search a 2D Matrix
这道题很简单,为此专门写篇博客其实算博客凑数了。给你一个每一行每一列都是增序,且每一行第一个数都大于上一行末尾数的矩阵,让你判断某个数在这个矩阵中是否存在。 假设矩阵是m*n,扫一遍的时间复杂度就是O(m*n),题目中给出的这么特殊的矩阵,时间复杂度可以降到O(m+n),具体代码如下,写的比较挫。
63 1
|
6月前
Leetcode 240. Search a 2D Matrix II
具体思路就是每一行倒着扫,扫到第一个比target小的数就跳到下行,如果等于当然是直接返回true了,如果下一行还比target小就继续跳下一行,直到最后一行。 为啥这么做是可行的? 可能我比较笨,想了半天才想到。 因为每一列都是增序的,举个例子,假设matrix[0][5] > target,那么[0][5]位置右下(包含右和下)所有元素不可能比target小。
30 0
|
算法
LeetCode 74. Search a 2D Matrix
编写一个有效的算法,搜索m×n矩阵中的值。 此矩阵具有以下属性: 每行中的整数从左到右排序. 每行的第一个整数大于前一行的最后一个整数.
52 0
LeetCode 74. Search a 2D Matrix
|
人工智能 BI
AtCoder Beginner Contest 216 F - Max Sum Counting (降维 背包dp)
AtCoder Beginner Contest 216 F - Max Sum Counting (降维 背包dp)
103 0
|
机器学习/深度学习
AtCoder Beginner Contest 215 F - Dist Max 2 (二分 单调队列)
AtCoder Beginner Contest 215 F - Dist Max 2 (二分 单调队列)
111 0
Leetcode-Easy 461.Hamming Distance
Leetcode-Easy 461.Hamming Distance
90 0
Leetcode-Easy 461.Hamming Distance
LeetCode之Hamming Distance
LeetCode之Hamming Distance
101 0
|
算法 Python
动态规划法(三)子集和问题(Subset sum problem)
  继续讲故事~~   上次讲到我们的主人公丁丁,用神奇的动态规划法解决了杂货店老板的两个找零钱问题,得到了老板的肯定。之后,他就决心去大城市闯荡了,看一看外面更大的世界。
2399 1