2023牛客暑期多校训练营6 A-Tree (kruskal重构树))

news2024/11/18 9:44:15

文章目录

  • 题目大意
  • 题解
  • 参考代码

题目大意

翻译
( 0 ≤ a i ≤ 1 ) , ( 1 ≤ c o s t i ≤ 1 0 9 ) (0\leq a_i\leq 1),(1 \leq cost_i\leq 10^9) (0ai1),(1costi109)

题解

提供一种新的算法,kruskal重构树。
该算法重新构树,按边权排序每一条边后,
新建一个点为“两边的节点所在最大节点”的父节点,该点点权为该边边权。
该树有一些特征:
①:是一个二叉树。
③:原节点全部为叶节点。
②:两个节点的LCA的点权就是其原最短路径的最大边权。
具体 Kruskal 算法学习
建树可以用并查集计算。
了解了这个算法我们再看问题,要求最大边权,这点可以用kruskal维护。
对于某个不为叶节点的节点 x x x ,它左儿子与右儿子匹配的黑白节点的最大边权显然为 w x w_x wx
显然的,我们可以枚举左右儿子节点中的黑白节点个数,乘上点权,即为该点的贡献。
我们发现答案可以通过 d f s dfs dfs 顺序从下往上来求解,且不会造成前效性,所以树形DP可以很好的解决这道题。
d p x , b dp_{x,b} dpx,b 表示在 x x x 的子树内有 b b b 个黑色节点的最优解。
d p x , b = m a x ( d p s o n , b l a c k 1 + d p s o n , b 2 + w x ∗ ( b l a c k 1 ∗ w h i t e 2 + b l a c k 2 ∗ w h i t e 1 ) ) dp_{x,b}=max(dp_{son,black1}+dp_{son,b2}+w_x*(black1*white2+black2*white1)) dpx,b=max(dpson,black1+dpson,b2+wx(black1white2+black2white1))
white/black_1/2表示1/2的子树中有几个白色/黑色节点
且black1+black2=b
我们发现枚举 b b b 的黑白分布情况,最多需要合并 m i n ( s u m s o n l , s u m s o n r ) min(sum_{sonl},sum_{sonr}) min(sumsonl,sumsonr)次,
不然的话就需要从大的部分取一部分给数量少的一颗子树。
特殊的,对于叶节点
d p x , b = ( w x = = b   ˆ 1 ) ∗ − c o s t x dp_{x,b}=(w_x==b \^\ 1)*-cost_x dpx,b=(wx==b ˆ1)costx
剩下的就好处理多了,写个DFS遍历一下即可处理。
计算时间复杂度,对于kruskal重构树,合并时长度最大为 l o g n log_n logn
即时间复杂度为 O ( N 2 l o g N ) O(N^2log_N) O(N2logN) 可以通过。

参考代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=6e3+5;
const int inf=1e18+7;
struct node{
    int x,y,w;
}f[N];
int fa[N],cost[N];
int w[N];
int n,m,t,ans;
int sonl[N],sonr[N];
int sum[N];
int dp[N][3000];
void dfs(int x)
{
    if(x<=n)                   //叶节点
    {
        dp[x][0]=(w[x]==1)*(-cost[x]);
        dp[x][1]=(w[x]==0)*(-cost[x]);
//        cout<<x<<" "<<0<<" "<<dp[x][0]<<endl;
//        cout<<x<<" "<<1<<" "<<dp[x][1]<<endl;
        sum[x]=1;
    }
    else
    {
        dfs(sonl[x]);
        dfs(sonr[x]);
        int res=min(sum[sonl[x]],sum[sonr[x]]);           //启发式合并平均复杂度为log_n
        sum[x]=sum[sonl[x]]+sum[sonr[x]];
        for(int i=0;i<=sum[sonl[x]];i++)
            for(int j=0;j<=sum[sonr[x]];j++)
                dp[x][i+j]=-inf;
        for(int i=0;i<=sum[sonl[x]];i++)           //枚举黑色节点个数
        {
            for(int j=0;j<=sum[sonr[x]];j++)              //DP转移
            {
                int s=dp[sonl[x]][i]+dp[sonr[x]][j]+w[x]*(i*(sum[sonr[x]]-j)+(sum[sonl[x]]-i)*j);
                dp[x][i+j]=max(dp[x][i+j],s);
                ans=max(ans,dp[x][i+j]);
            }
        }            
    }
}
int cmp(node a,node b)
{
    return a.w<b.w;
}
int sf(int x)
{
    if(fa[x]==x)
        return x;
    return fa[x]=sf(fa[x]);
}
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%lld",&w[i]);
    for(int i=1;i<=n;i++)
        scanf("%lld",&cost[i]);
    for(int i=1;i<n;i++)
        scanf("%lld%lld%lld",&f[i].x,&f[i].y,&f[i].w);
    sort(f+1,f+n,cmp);
    t=n;
    for(int i=1;i<=2*n;i++)
        fa[i]=i;
    for(int i=1;i<n;i++)             //kruskal构树
    {
        int x=sf(f[i].x),y=sf(f[i].y);
        fa[x]=++t;
        fa[y]=t;
        w[t]=f[i].w;
        sonl[t]=x;
        sonr[t]=y;
    }
    dfs(t);
    printf("%lld",ans);
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学会这样提问,你就超过了82.7%的老网工

下午好&#xff0c;我的网工朋友 很多朋友会说&#xff0c;我怎么问问题&#xff0c;在群里&#xff0c;或者后台&#xff0c;还有给老杨总发消息&#xff0c;都没收到比较详细的回复&#xff1f;尤其是问技术问题的时候。 除了我们回复消息的时间和精力的确比较有限之外&…

JMeter压力测试记录

最近在学习redis解决高并发下导致数据库数据不准确的问题&#xff0c;使用到了一些工具&#xff0c;包括Jmeter&#xff0c;Redis-desktop-manager.。Jmeter用于模拟高并发情景&#xff0c;Redis-desktop-manager是redis数据库的GUI界面。 一、单元测试生成测试数据 1)插入20…

python可以做哪些小工具,python可以做什么小游戏

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python可以做什么好玩的&#xff0c;python可以做什么小游戏&#xff0c;今天让我们一起来看看吧&#xff01; 最近有几个友友问我说有没有比较好玩的Python小项目来练手&#xff0c;于是我找了几个比较有意思的给他们&…

进程间的六种通信方式以及优缺点总结

参考博客链接&#xff1a;https://blog.csdn.net/qq_34827674/article/details/107678226 前提知识&#xff1a;每个进程都有自己的用户空间&#xff0c;而内核空间是每个进程共享的。因此进程之间想要进行通信&#xff0c;就需要通过内核来实现。 1、管道 管道是最简单&…

Springboot部署ELK实战

Springboot部署ELK实战 1、部署docker、docker-compose环境安装docker安装docker-compose 2、搭建elk1、构建目录&&配置文件1、docker-compose.yml 文档2、Kibana.yml3、log-config.conf 2、添加es分词器插件3、启动 3、Springboot项目引入es、logStash配置1、引入依赖…

ORALCE RAC总结

一:ORACLE RAC集群安装 ASM磁盘管理 二:ORACLE RAC集群报错排查总结 三:ORACLE RAC集群报错排查总结 3.1 ORA-29760: instance_number parameter not specified RAC1节点,RAC2节点 解决 export ORACLE_SID=a81(数据库实例名) 3.2 参考资料 ORACLE RAC集群 安装参…

深度学习(34)—— StarGAN(2)

深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;2&#xff09; 完整项目在这里&#xff1a;欢迎造访 文章目录 深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;2&#xff09;1. build model&#xff08;1&#xff09;generator&#xff08;2&#…

人有教养的十大特征!

教养&#xff0c;就是一个人的品行。 什么是教养&#xff1f; 教养&#xff0c;是一种尊重&#xff0c;也是将心比心的善意&#xff1b;教养&#xff0c;是一种气量&#xff0c;也是宽以待人的度量&#xff1b;教养&#xff0c;是一种品德&#xff0c;也是崇高的人格魅力。 …

如何入门/转行网络安全,实现自己的“黑客梦”

1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; 第一阶段&#xff1a;基础操作入门 入门的第一步是学习一些当下主流的安全工具课程并配套基础原理的书籍&#xff0c;一般来说这个过程在1个月左右比较合适。 第二阶…

java如何将tif文件拆分为多个jpg文件,附jar包下载地址

1.在build.gradle中添加依赖&#xff1a; implementation group: javax.media, name: jai_codec, version: 1.1.3implementation group: com.sun, name: jai_core, version: 1.1.3implementation group: javax.media, name: jai_imageio, version: 1.1implementation xx.com.su…

OpenLayers入门,OpenLayers解析通过fetch请求的GeoJson格式数据,并叠加要素文字标注,以行政区划边界为例

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解如何使用OpenLayers通过fetch请求geojson数据,然后通过OpenLayers解析为Feature要素叠加到图层上,并且通过动态设置标注方式显示要素属性为文字标注。 本章还是以行政区划边界为例,这个示例在开发中比较常用,建议收藏…

51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验四 蜂鸣器

目录 前言 一、原理图及知识点介绍 1.1、蜂鸣器原理图&#xff1a; 二、代码分析 前言 第一个实验:51单片机&#xff08;普中HC6800-EM3 V3.0&#xff09;实验例程软件分析 实验一 点亮第一个LED_ManGo CHEN的博客-CSDN博客 第二个实验:51单片机&#xff08;普中HC6800-EM…

【树】 二叉树 堆与堆排序 平衡(AVL)树 红黑(RB)树

目录 1 树1.1 认识树1.2 树的相关概念1.3 树的表示孩子兄弟表示法 2 二叉树2.1 概念2. 2 特殊二叉树2.3 二叉树的性质2.4 二叉树的存储结构 3 堆 — 完全二叉树的顺序结构实现3.1 堆的概念3.2 核心代码3.3 堆应用1 堆排序2 TOP-K问题 4 二叉树的链式存储4.1 二叉链结构与初始化…

大道至简,炎凰数据要做极致好用的国产大数据分析基础软件|爱分析调研

自2000年代初大数据技术诞生以来&#xff0c;为了应对不断丰富的应用场景、日益复杂的数据类型&#xff0c;以及逐渐膨胀的数据规模&#xff0c;大数据业内逐渐发展出了多种技术路线。 到今天&#xff0c;大数据产品和技术已处于百花齐放的状态&#xff0c;国内市场近年来也因…

.Net6 Web Core API --- AOP -- log4net 封装 -- MySQL -- txt

目录 一、引入 NuGet 包 二、配置log4net.config 三、编写Log4net封装类 四、编写日志记录类 五、AOP -- 拦截器 -- 封装 六、案例编写 七、结果展示 一、引入 NuGet 包 log4net Microsoft.Extensions.Logging.Log4Net.AspNetCore MySql.Data ---- MySQL…

好用的智能ai绘画文字转绘画软件大揭秘

在一个平凡的小镇上&#xff0c;有一位名叫李彤的年轻画家。她对绘画充满了热爱和渴望。但因为经济条件有限&#xff0c;无法承担昂贵的绘画软件费用。然而&#xff0c;就在她感到困惑和单调的文字转换为令人惊叹的绘画作品&#xff0c;让每一位渴望艺术表达的人都能轻松实现自…

css实现卡片的左上角有一个三角形的遮盖效果

需求: 卡片的左上角有一个绿色的三角形标签,用来区分状态 实现: .vCard{position: relative;overflow: hidden; } .vCard::before {content: "";position: absolute;top: 0;left: 0;width: 0;height: 0;border-bottom: 20px solid transparent;border-left: 20px …

直线模组在机械手中的应用

机械手是一种能模仿人手和臂的某些动作功能&#xff0c;用以按固定程序抓取、搬运物件或操作工具的自动操作装置&#xff0c;可代替人的繁重劳动以实现生产的机械化和自动化&#xff0c;能在有害环境下操作以保护人身安全&#xff0c;因而广泛应用于机械制造、冶金、电子、轻工…

创新赛制,顶尖赛题!| 2023第二届粤港澳大湾区(黄埔)国际算法算例大赛十赛道虚位以待!

2023 第二届“粤港澳大湾区&#xff08;黄埔&#xff09;国际算法算例大赛”&#xff08;以下简称“大赛”&#xff09;于 2023 年 7 月 15 日正式开赛。大赛面向全球&#xff0c;诚邀有创新精神&#xff0c;并有较好的AI算法算例基础的高校学生、AI领域相关企业和研究院所的从…

硬件串口通信协议学习(UART、IIC、SPI、CAN)

0.前言 学习资料&#xff1a;江协科技的个人空间-江协科技个人主页-哔哩哔哩视频 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 全双工&#xff1a;通信…