HDU7458-启发式合并优化DP

news/2024/11/15 8:35:01/文章来源:https://www.cnblogs.com/yoshinow2001/p/18329235

link:https://acm.hdu.edu.cn/showproblem.php?pid=7458
题意:给一棵树,每个点有点权 \(w\) 和颜色 \(c\),选择若干条不相交的路径,每条路径的起始点颜色相同,权值为起始点的权值之和,最大化权值之和。


对每条路径 \((u,v)\) 可以放到LCA上考虑,即我们对每个子树考虑,设 \(f(i,0/1)\) 分别表示在 \(i\) 的子树内,强制选/不选 \(i\) 号点,在子树内能获得的最大收益,\(g(i)=\max(f(i,0),f(i,1))\),记 \(S_u\) 表示 \(u\) 的所有子节点好了,那么:

\[f(x,0)=\sum_{v\in S_x}g(v) \]

\(f(x,1)\)有几种情情况:从某两个不同的子节点中的某两个同色点连上来的,或者是直接从 \(x\) 作为一个端点连到某个孩子节点的,第一种情况是:

算答案的时候刚好多减去一个 \(g\),所以我们直接对每个子树中每个颜色,维护 \(w_{u1}+\sum (f(u_i,0)-g(u_i))\) 的最大值,因为对每个颜色只关心最大值,可以用一个 map (甚至可以是unordered的)维护,每跳一层就给这个子树做一个全局加 \(f(u,0)-g(u)\) 的操作,用树上启发式合并的办法,同时维护一个加法标记即可。

对于直接从 \(x\) 连下去的情况类似

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define endl '\n'
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
const int N=2e5+5;
int n,c[N];
ll f[N][2],g[N],w[N];
vector<vector<int>> G;int bl[N];
ll tag[N];
map<int,ll> mp[N];
void upd(ll &x,ll y){x=max(x,y);}
void dfs(int x,int fa){f[x][0]=f[x][1]=g[x]=0;for(auto to:G[x])if(to!=fa){dfs(to,x);f[x][0]+=g[to];}for(auto v:G[x])if(v!=fa){if(mp[bl[v]].count(c[x]))upd(f[x][1],(mp[bl[v]][c[x]]+tag[bl[v]])+f[x][0]+w[x]);//merge v to x;if(mp[bl[v]].size()>mp[bl[x]].size())swap(bl[v],bl[x]);//calcfor(auto [col,val]:mp[bl[v]]){if(mp[bl[x]].count(col))upd(f[x][1],(val+tag[bl[v]])+(mp[bl[x]][col]+tag[bl[x]])+f[x][0]);}//mergefor(auto [c,val]:mp[bl[v]]){if(mp[bl[x]].count(c))upd(mp[bl[x]][c],val+tag[bl[v]]-tag[bl[x]]);else mp[bl[x]][c]=val+tag[bl[v]]-tag[bl[x]];}}if(mp[bl[x]].count(c[x]))upd(mp[bl[x]][c[x]],w[x]-tag[bl[x]]);else mp[bl[x]][c[x]]=w[x]-tag[bl[x]];g[x]=max(f[x][0],f[x][1]);tag[bl[x]]+=f[x][0]-g[x];
}void solve(){cin>>n;rep(i,1,n)cin>>c[i];rep(i,1,n)cin>>w[i];G=vector<vector<int>> (n+1);rep(i,1,n)bl[i]=i,tag[i]=0,mp[i].clear();rep(i,1,n-1){int u,v;cin>>u>>v;G[u].push_back(v);G[v].push_back(u);}dfs(1,-1);// rep(i,1,n)cout<<f[i][0]<<' '<<f[i][1]<<' '<<g[i]<<endl;cout<<g[1]<<endl;
}
int main(){fastio;int tc;cin>>tc;while(tc--)solve();return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode617. 合并二叉树

题目链接:https://leetcode.cn/problems/merge-two-binary-trees/description/ 题目叙述: 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是…

线段树(1)建树、单点修改、单点查询、区间查询和例题

闲了好久的wym复活拉~更个辣鸡的线段树 如果你不知道什么是线段树这个就不用看 由于我们平时可能会遇到一些恶心的题叫做给你 \(10^5\) 个数的数组,然后 \(10^5\) 次修改或查询,这样显然暴力是可以做的而且ST表我们无视修改。这个时候可以用线段树、树状数组或者其他大佬们的…

全网最适合入门的面向对象编程教程:26 类和对象的 Python 实现-上下文管理器和 with 语句

本文主要介绍了在使用Python面向对象编程时,如何使用上下文管理器和with语句替换异常处理中try...finally语句,并介绍了with语句的优点和应用场景。全网最适合入门的面向对象编程教程:26 类和对象的 Python 实现-上下文管理器和 with 语句摘要: 本文主要介绍了在使用 Pytho…

RMI 反序列化详细分析

java RMI 学习 RMI 是什么 Java RMI(Java Remote Method Invocation),即Java远程方法调用。是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。RMI 使用 JRMP(一种协议)实现,使得客户端运行的程序可以调用远程服务器上的对象。是实现RPC的一种方式。 RMI 的构…

GPT-SoVITS —— 5s 声音样本就可以训练模型,复刻声音的 AI 应用

用极少量的声音样本,快速训练模型,复刻声音。然后用改声音进行推理,完成文本到语音的转换。今天给大家介绍一个开源项目:GPT-SoVITS 项目地址: https://github.com/RVC-Boss/GPT-SoVITS 从某种意义上来说,它是一个 TTS 模型。支持从文本到语音的转换。单纯的 TTS 模型有很…

C++继承时的修饰符

在继承时加入的关键字,可以修饰继承来的类成员这里的func1()和func2()都是proteced,不能在类外部访问这里的func1()是public,但是func2()依然是protected

财务知识-17条常用的计提会计分录总结

财务知识-17条常用的计提会计分录总结❗️

Segment-anything学习到微调系列_SAM初步了解

## 前言 本系列文章是博主在工作中使用SAM模型时的学习笔记,包含三部分: 1. SAM初步理解,简单介绍模型框架,不涉及细节和代码2. SAM细节理解,对各模块结合代码进一步分析3. SAM微调实例,原始代码涉及隐私,此部分使用公开的VOC2007数据集,Point和Box作为提示进行mask de…

一个贝塞尔曲线编辑工具(2d)

曲线在unity下如何绘制? 类似绘制圆,是用一段一段的线段拼接来模拟的,这边也是类似,可以用一段一段的线段来模拟曲线。既然要模拟,那我们也得知道贝塞尔曲线的公式才行。 一般用的比较多的就是3次贝塞尔曲线,该曲线由起点p1,p1的控制点c1,终点p2,p2的控制点c2组成。公…

烧录算法制作

前言 在使用Keil的时候,我们一般会通过一个下载器与目标芯片连接,这样就可以实现的代码下载或调试。那么下载器是如何将我们的应用程序烧写在我们芯片内部Flash当中的呢,是否可以同样的方式烧录在外部Flash上呢?这是此片文章所要说明的。 MDK下载算法原理 通过MDK创建一批与…

Mocreak Office Installer(Office安装部署工具) v2.3.0.703 中文绿色版

概述 Mocreak 是一款一键自动化下载、安装、部署正版 Office 的办公增强工具。该工具完全免费、无广告、绿色、无毒、简约、高效、安全。软件特点 一键快速下载、安装、部署最新版 Microsoft Office 软件。提供简约、高效,且可自定义的图形界面,提升部署效率。支持将 Office …