Fake Plastic Trees

传送门
题意:
一棵有根的树,有n个顶点,每个顶点的父亲节点为pv, 每个节点上都有一个值,刚开始的值都为0,在v顶点上的值表示为av, 对于所有的av, 我们想要$l_v<=a_v<=r_v, 为了实现这个操作,我们有如下操作可以做,选择一些顶点v, 1 到这个顶点的路径上的所有顶点都加上一个数组c, c1,c2,c3,,ck, 即对应路径上的点都 + 对应的c, 求最少的操作次数能达到上述效果


思路:
树的问题,不难想到从叶子节点进行考虑,首先最多的操作次数为n, 叶子节点是必须要通过路径进行操作的,(++ans) 对于父亲节点,叶子节点要取值肯定是取到最大的,所有的叶子节点的值的综合,是不管父亲节点的l, r的最大取值

  • 如果这个取值比l小,说明父亲节点也要进行一次路径到达, (++ans) 那父亲节点对他的上级的贡献就是r
  • 如果这个取值 >= l, 说明这个点是不用取的,那他对上级的贡献就是min(叶子节点的贡献,r)

最后ans的值即为答案


总结:
树上的贪心,又是从叶子节点开始确定状态,一级一级往上推,这里有一个亮点,如果一条路径上的点进行取值且取值要满足升序的话,可以用后面的最大值来进行限制,即如果后面取的一个值后,只要前面的取值是 <= 他的,就可以相当于是升序取的,因为最大的情况也是和后面的值取到相等,如果后面值可以取的比他大,那对于千前面的数当然小于他的都行,只要满足每一级的关系正确即可


点击查看代码
#include <bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(false);
#define int long long
using namespace std;

typedef long long ll;
const int N = 2e5 + 10;
int T, n, ans = 0;
struct Node
{
    ll l, r;
} interval[N];
vector<int> v[N];

void Init()
{
    for (int i = 1; i <= n; ++i)
    {
        v[i].clear();
        ans = 0;
    }
}

int dfs(int x, int fa)
{
    if (v[x].size() == 1 && x != 1) //说明到叶子节点了, 对于叶子节点肯定是全取,取到r, 因为c必须升序
    {
        ++ans;
        return interval[x].r;   //叶子节点反馈肯定是最大值
    }
    ll sum = 0;
    for (int i = 0; i < v[x].size(); ++i)
    {
        int y = v[x][i];
        if (y == fa)
            continue;
        sum += dfs(y, x);
        
    }
    if (sum >= interval[x].l)   //这个点不用再操作了
    {
        sum = min(sum, interval[x].r);  //对上级的反馈不能超过上限
    }
    else    //说明子节点最大都满足不了
    {
        sum = interval[x].r;    //这里肯定填最大值
        ++ans;  //此时这个点必须填次值了
    }
    return sum;
}

signed main()
{
	IOS; cin.tie(0), cout.tie(0);
    cin >> T;
    while (T--)
    {
        cin >> n;
        
        Init();

        for (int i = 2; i <= n; ++i)    //建边
        {
            int x;
            cin >> x;
            v[x].push_back(i);
            v[i].push_back(x);
        }
        for (int i = 1; i <= n; ++i)
        {
            cin >> interval[i].l >> interval[i].r;
        }

        dfs(1, -1);

        cout << ans << endl;
    }

	return 0;
}

posted @   YUGUOTIANQING  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示