2023天梯赛 L3_2 完美树 【树形DP、01最大/小价值】

完美树

1
2

思路

观察发现:如果一颗子树 u u u,它刚好有偶数个节点,那么 0 0 0 1 1 1 的染色数量一定相等,如果有奇数个节点,那么 0 0 0 1 1 1 的数量一定恰好相差 1 1 1(可能是 0 0 0 多,也可能是 1 1 1 多)
对于当前节点 u u u,先算出它的子树大小,然后对于它的每个儿子 v v v

  1. 如果 v v v 的子树大小是偶数,那么就加上 v v v 0 , 1 0,1 0,1 相等最小花费
  2. 如果 v v v 的子树大小是奇数,那么需要考虑 v v v 0 0 0 还是 1 1 1 的最小花费

这里存在一些子状态,我们可以使用树形 D P DP DP,定义:

  • d p [ u ] [ 0 ] dp[u][0] dp[u][0] 为以 u u u 为完美子树, 0 0 0 恰好比 1 1 1 多一个
  • d p [ u ] [ 1 ] dp[u][1] dp[u][1] 为以 u u u 为完美子树, 1 1 1 恰好比 0 0 0 多一个
  • d p [ u ] [ 2 ] dp[u][2] dp[u][2] 为以 u u u 为完美子树, 0 0 0 1 1 1 数量相等

那么前面的转移可以变为:

  1. 如果 v v v 的子树大小是偶数,加上 d p [ v ] [ 2 ] dp[v][2] dp[v][2]
  2. 如果 v v v 的子树大小是奇数,那么需要考虑选 d p [ v ] [ 0 ] dp[v][0] dp[v][0] 还是 d [ v ] [ 1 ] d[v][1] d[v][1],注意这里不能全选最小,因为最后 u u u 还要保证 0 0 0 1 1 1 的数量不能相差超过 1 1 1 个,因此 01 01 01 的选择要均衡一些

其实这里是一个经典模型:

给定 k k k 个物品,每个物品有 0 0 0 1 1 1 两种状态,两种状态各有一个价值
问从中选 x x x 0 0 0 k − x k - x kx 1 1 1最小花费是多少?


我们先将 w [ i ] [ 0 ] − w [ i ] [ 1 ] w[i][0] - w[i][1] w[i][0]w[i][1] 最为一个衡量标准,如果这个值越小(有可能为负数),说明这个物品越适合选 0 0 0 而不是 1 1 1
那么我们可以假设全部选上 1 1 1,当前花费 c o s t = ∑ w [ i ] [ 1 ] cost = \sum w[i][1] cost=w[i][1]
然后将所有物品按照 w [ i ] [ 0 ] − w [ i ] [ 1 ] w[i][0] - w[i][1] w[i][0]w[i][1] 升序 排列,选择前 x x x改为 0 0 0 即可
c o s t + = ∑ i = 1 x ( w [ i ] [ 0 ] − w [ i ] [ 1 ] ) cost += \sum_{i = 1}^{x} (w[i][0] - w[i][1]) cost+=i=1x(w[i][0]w[i][1])
这样子一定是最小花费

回到这题,其实也是一样的道理,对于 u u u 的大小分奇偶讨论,然后从它所有大小为奇数的儿子中选择一些为 0 0 0,另一些为 1 1 1 即可

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

const int N = 100050;

std::vector<int> g[N];
ll p[N];
int c[N];
ll dp[N][3];
int son[N];

void dfs(int u){
    dp[u][0] = dp[u][1] = dp[u][2] = INF;
    son[u] = 1;
    int sz = 1;
    ll sum = (c[u] ? 0 : p[u]);
    std::vector<ll> vec;
    vec.push_back((c[u] ? p[u] : -p[u]));
    for(auto v : g[u]){
        dfs(v);
        son[u] += son[v];
        if(son[v] % 2 == 0){ //儿子偶数直接加
            sum += dp[v][2];
            continue;
        }
        else{
            ++sz;
            sum += dp[v][1];
            vec.push_back(dp[v][0] - dp[v][1]); //奇数要先选1
        }
    }
    std::sort(ALL(vec)); //按衡量标准升序排序
    if(son[u] % 2 == 0){ //偶数 0 和 1 一样多
        fore(i, 0, sz / 2) sum += vec[i];
        dp[u][2] = sum;
    }
    else{ //奇数要考虑 0 多还是 1 多
        fore(i, 0, sz / 2) sum += vec[i];
        dp[u][1] = sum;
        dp[u][0] = sum + vec[sz / 2];
    }
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int n;
    std::cin >> n;
    fore(i, 1, n + 1){
        int k;
        std::cin >> c[i] >> p[i] >> k;
        while(k--){
            int v;
            std::cin >> v;
            g[i].push_back(v);
        }
    }
    dfs(1);
    if(n & 1) std::cout << std::min(dp[1][0], dp[1][1]);
    else std::cout << dp[1][2];
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/557045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony多媒体-mp4parser

简介 一个读取、写入操作音视频文件编辑的工具。 编译运行 1、通过IDE工具下载依赖SDK&#xff0c;Tools->SDK Manager->Openharmony SDK 把native选项勾上下载&#xff0c;API版本>10 2、开发板选择RK3568&#xff0c;ROM下载地址. 选择开发板类型是rk3568&#xf…

高可用集群——keepalived

目录 1 高可用的概念 2 心跳监测与漂移 IP 地址 3 Keepalived服务介绍 4 Keepalived故障切换转移原理介绍 5 Keepalived 实现 Nginx 的高可用集群 5.1 项目背景 5.2 项目环境 5.3 项目部署 5.3.1 web01\web02配置&#xff1a; 5.3.2nginx负载均衡配置 5.3.3 主调度服…

碳实践|手把手教你开展组织碳核算

一、背景介绍 政府间气候变化委员会 IPCC(Intergovernmental Panel on Climate Chang)是世界气象组织(WMO)及联合国环境规划署(UNEP)于1988年联合建立的政府间机构。 IPCC在1997年和2000年分别发布了《1996 年 IPCC 国家温室气体清单指南修订本》和《国家温室气体清单优良作法…

【氮化镓】栅极漏电对阈值电压和亚阈值摆幅影响建模

本文是一篇关于p-GaN门AlGaN/GaN高电子迁移率晶体管&#xff08;HEMTs&#xff09;的研究文章&#xff0c;发表于《应用物理杂志》&#xff08;J. Appl. Phys.&#xff09;2024年4月8日的期刊上。文章的标题为“Analysis and modeling of the influence of gate leakage curren…

什么是SRE?

什么是SRE&#xff1f; SRE&#xff0c;全称为Site Reliability Engineering&#xff0c;即网站可靠性工程&#xff0c;是一种职能角色&#xff0c;它融合了软件工程和系统管理的技能与实践&#xff0c;旨在通过软件和自动化的方式来提高系统的可靠性、稳定性和扩展性。以下是…

Zabbix自定义模板、邮件报警、自动发现与注册、proxy代理、SNMP监控

目录 自定义监控内容 1.明确需要执行的 linux 命令 2.创建 zabbix 的监控项配置文件&#xff0c;用于自定义 key 3.在服务端验证新建的监控项 在 Web 页面创建自定义监控项模板 1.创建模板 2.创建应用集&#xff08;用于管理监控项的&#xff09; 3.创建监控项 4.创建…

JEECG表格选中状态怎么去掉

官网代码&#xff08;在取消选中状态的时候不生效&#xff09; rowSelection() {return {onChange: (selectedRowKeys, selectedRows) > {console.log(selectedRowKeys: ${selectedRowKeys}, selectedRows: , selectedRows);},getCheckboxProps: record > ({props: {disa…

【基础】gcc-动态库和静态库的创建和使用-命令

目录 1 动态库的建立使用2 动态库封装过程2.1 编译动态库2.2 使用动态库2.3 命令参数说明 3 静态库封装过程3.1 静态库的封装3.2 静态库的使用 1 动态库的建立使用 首先建立一个头文件&#xff0c;和三个.cpp文件&#xff0c;目的是要把这些文件链接成动态库&#xff1a; 其中…

C#创建背景色渐变窗体的方法:创建特殊窗体

目录 1.让背景渐变色的理论基础 2.让背景渐变色的方法 3.一个实施例 &#xff08;1&#xff09;Form1.Designer.cs &#xff08;2&#xff09;Form1.cs &#xff08;3&#xff09;渐变的蓝色背景 在窗体设计时&#xff0c;可以通过设置窗体的BackColor属性来改变窗口的背…

Golang | Leetcode Golang题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; func searchInsert(nums []int, target int) int {n : len(nums)left, right : 0, n - 1ans : nfor left < right {mid : (right - left) >> 1 leftif target < nums[mid] {ans midright mid - 1} else {left mid 1}}retu…

【mac】【python】新建项目虚拟环境后,使用命令pip出现错误:zsh: command not found: pip

【mac】【python】新建项目虚拟环境后&#xff0c;使用命令pip出现错误&#xff1a;zsh: command not found: pip 问题描述&#xff1a; 拉取或者创建新的python项目时&#xff0c;为项目添加了新的解释器&#xff0c;创建啦虚拟环境&#xff0c;但是执行pip命令的时候找不到命…

倾斜摄影修模软件模方(ModelFun)4.1.0下载及安装教程

文章目录 一、模方(ModelFun)4.1.0安装二、模方(ModelFun)4.1.0下载一、模方(ModelFun)4.1.0安装 订阅专栏后(获取专栏内所有文章阅读权限及软件安装包),从文末下载软件模方(ModelFun)4.1.0安装包,如下所示,并开始安装。 1.计算机需要进入测试模式 键盘WIN+R,打开运行窗…

重磅福利!参与现金红包抽奖活动,赶快行动吧!

文章目录 粉丝福利 粉丝福利 亲爱的朋友们&#xff0c;令人振奋的消息来啦&#xff01;本月&#xff0c;我们特地为大家准备了一份特别的粉丝福利&#xff01;只要您轻轻一点&#xff0c;关注我们的公众号&#xff0c;就有机会抽取现金红包&#xff0c;让您的生活多一份惊喜与喜…

游戏前摇后摇Q闪E闪QE闪QA等操作

备注&#xff1a;未经博主允许禁止转载 个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_w…

jenkins修改全局安全配置之后登录错误

教训&#xff08;流泪&#xff09; 事情是这样的&#xff0c;第一次我需要用单点登录集成jenkins&#xff0c;jenkins可以通过插件的方式支持cas协议&#xff0c;我当时也不很懂&#xff0c;经过我学网上的一顿乱配置&#xff0c;jenkis上不去了&#xff0c;虽然这是公司本地环…

【Linux学习】初识shell命令以及运行原理

这里写目录标题 &#x1f680;shell命令以及运行原理 &#x1f680;shell命令以及运行原理 Linux严格意义上说的是一个操作系统&#xff08;如下图所示&#xff09;&#xff0c;我们称之为“核心&#xff08;kernel&#xff09;“ 。 Linux系统的shell作为操作系统的外壳&…

开源大模型Llama 3 横空出世,4000亿参数性能直逼GPT-4

开源大模型Llama 3王者归来!最大底牌4000亿参数,性能直逼GPT-4 扎克伯格:「有了 Llama 3,全世界就能拥有最智能的 AI。」 ChatGPT 拉开了大模型竞赛的序幕,Meta 似乎要后来居上了。 扎克伯格在 Facebook 上发帖:Big AI news today. 借助先进的 Llama 3 模型,Meta 的 A…

STL的stack和queue(三):基于适配器模式的反向迭代器

目录 前言 list的反向迭代器 list.h文件 ReverseIterator.h文件 test.cpp文件 前言 迭代器按性质分类&#xff1a; 单向&#xff1a;forward_list双向&#xff1a;list随机&#xff1a;vector / deque 迭代器按功能分类&#xff1a; 正向反向const list的反向迭代器…

【笔试强训】Day2 --- 牛牛的快递 + 最小花费爬楼梯 + 数组中两个字符串的最小距离

文章目录 1. 牛牛的快递2. 最小花费爬楼梯3. 数组中两个字符串的最小距离 1. 牛牛的快递 【链接】&#xff1a;牛牛的快递 解题思路&#xff1a;简单模拟题&#xff0c;主要是处理⼀下输⼊的问题。 #include <iostream> #include <cmath> using namespace std;…

我与C++的爱恋:日期计算器

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好啊&#xff0c;在我们学习了默认成员函数后&#xff0c;我们通过上述内容&#xff0c;来实现一个简易的日期计算器。 ​ ​ 头文件的声明 #pragma once #incl…