首页 > 其他分享 >HDU 5834 Magic boy Bi Luo with his excited tree

HDU 5834 Magic boy Bi Luo with his excited tree

时间:2023-10-03 13:12:02浏览次数:41  
标签:boy HDU his g0 int gg 100001 返程 now

题意:

给出一棵\(n\)个节点的树,树上每一个节点都有一个权值\(v\),每条边都有一个代价\(w\),从一个点出发,经过一个点可以得到等同于其点权的收益,经过一个点可以得到等同于其点权的收益,经过一条边可以得到等同于其权值的代价,点权只会获得一次,但是代价会花费多次。
对于每个点,询问从这个点出发,可以得到的最大价值,价值定义为获得点权的收益和减去经过边的代价和。

分析:

首先观察一下答案路径的构成。不难发现对于每个点,答案的路径一定是去若干条链(可以走向父亲),然后回到这个点,只不过最后一次不用走返程。于是我们发现关键点就是这一条不用返程的链。

于是我们可以把答案路径分成两种:

  • 1.不用返程的链走向了父亲
  • 2.不用返程的链走向了子树内

对于第一种答案,分成两部分:

  • 1.在子树内走,最后回到该点
  • 2.向子树外走,不用回来

同样的,对于第二种答案:

  • 1.向子树外走,最后回到该点
  • 2.向子树内走,不用回来

式子就自己推把。

总结:

思路其实很简单,就是麻烦

#include<bits/stdc++.h>
using namespace std;
int n;
int ans[100001];
int a[100001];
int f[100001];//f[i]表示从i出发在i的子树里走一圈最后回到i的最大价值
int g[100001];//g[i]表示从i出发去i的子树里不回来的最大价值
int gg[100001];
//int g1[100001];
int g0[100001];//g0[i]表示使得g[i]最大的子树 
int s[100001];//s[i]表示从i出发,去子树外走一圈的最大价值
int t[100001];//t[i]表示从i出发去i的子树外不回来的最大价值
struct node{
	int to;
	int val;
};

vector<node> v[100001];

void dfs1(int now,int fa){
	for(int i=0;i<v[now].size();i++){
		if(v[now][i].to==fa) continue;
		dfs1(v[now][i].to,now);
		f[now]+=max(0,f[v[now][i].to]-(2*v[now][i].val));		
	}
}

void dfs2(int now,int fa){
	for(int i=0;i<v[now].size();i++){
		if(v[now][i].to==fa) continue;
		dfs2(v[now][i].to,now);
		int tt=(f[now]-max(0,f[v[now][i].to]-2*v[now][i].val)+max(0,g[v[now][i].to]-v[now][i].val));
		if(tt>g[now]){
			//g1[now]=g0[now];
			g0[now]=v[now][i].to;
			gg[now]=g[now];
			g[now]=tt;
		}
		else if(tt>gg[now]){
			gg[now]=tt;
			//g1[now]=v[now][i].to;
		}
	}
}

void dfs3(int now,int fa){
	for(int i=0;i<v[now].size();i++){
		if(v[now][i].to==fa) s[now]=max(s[now],f[fa]-max(0,f[now]-2*v[now][i].val)+s[fa]-2*v[now][i].val);
		else dfs3(v[now][i].to,now);
	}
}

void dfs4(int now,int fa){
	for(int i=0;i<v[now].size();i++){
		if(v[now][i].to==fa){
			t[now]=max(t[now],t[fa]+f[fa]-max(0,f[now]-2*v[now][i].val)-v[now][i].val);
			if(g0[fa]!=now){
				t[now]=max(t[now],g[fa]-max(0,f[now]-2*v[now][i].val)+s[fa]-v[now][i].val);
			}
			else{
				t[now]=max(t[now],gg[fa]-max(0,f[now]-2*v[now][i].val)+s[fa]-v[now][i].val);
			}
			continue;
		}
		else dfs4(v[now][i].to,now);
	}
	ans[now]=max(f[now]+t[now],g[now]+s[now]);
}

signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[i]=a[i];
		g[i]=a[i];
	}
	for(int i=1;i<n;i++){
		int u,vv,w;
		cin>>u>>vv>>w;
		v[u].push_back({vv,w});
		v[vv].push_back({u,w});
	}
	dfs1(1,0);
	dfs2(1,0);
	dfs3(1,0);
	dfs4(1,0);
	/*
	for(int i=1;i<=n;i++) cout<<f[i]<<" ";
	cout<<endl;
	for(int i=1;i<=n;i++) cout<<g[i]<<" ";
	cout<<endl;
	*/
	for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
	return 0;
}

标签:boy,HDU,his,g0,int,gg,100001,返程,now
From: https://www.cnblogs.com/wangwenhan/p/17741018.html

相关文章

  • 神器 CodeWhisperer
    这两天看到了好多关于AmazonCodeWhisperer针对个人用户终身免费使用的消息,便抽空简单来重点介绍下如何在VSCode这款IDE上安装和使用CodeWhisperer。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞......
  • 题解 hdu 1269 迷宫城堡
    找点图论练习题写,发现hdu又寄了,那就发到blog里吧。思路:tarjan缩点判断DAG中点数是否为1。若是,则该图为强连通图。 //producedbymiya555//stupidmistakes:多测记得清空//ideas:tarjan模板#include<bits/stdc++.h>usingnamespacestd;constintN=10010;intn,m,low[......
  • 免费 AI 代码生成器 Amazon CodeWhisperer 初体验
    文章作者:浪里行舟简介随着ChatGPT的到来,不由让很多程序员感到恐慌。虽然我们阻止不了AI时代到来,但是我们可以跟随AI的脚步,近期我发现了一个神仙AI代码生产工具CodeWhisperer,它是一项基于机器学习的服务,其根据自然语言注释和集成开发环境(IDE)中的代码,生成代码建议,帮助......
  • this.getOptions is not a function at Object.loader
    问题描述VuePress使用有样式的组件时报错this.getOptionsisnotafunctionatObject.loader原因分析是这个导致的<stylelang="scss">你的依赖反应不了它就会报错解决方案需要安装sass-loaderstyle-loadersass-loader版本不能太高。。。安装@7的成功运行......
  • 使用 AI 编程助手 CodeWhisperer,开发如有神助
    前段时间体验了chatGPT,听说它可以写代码,结果发现更多的只是一个对答写小作文的百度助手,虽然也能写代码,但不是我想要的,可以在idea中可以快速生成代码块的。一个偶然的机会,从微信群里了解到,由亚马逊云科技推出的CodeWishPerer开发插件,可以在多个开发环境中使用,如:VisualStudio(VS......
  • P2602 [ZJOI2010] 数字计数&HDU 2089 (数位dp)
    luoguHDU最近在复习数位dp数位dp,就是在一些计数问题的时候按照一位一位的顺序依次计算,通常可以采用记忆化搜索的方式这两道题就是很典型的数位dp数位dp通常要记录是不是顶着上限,有没有前导零,到了哪一位以及一些特殊的条件要求。数位dp通常要把某个区间的问题转变成两个区间......
  • vue中的this.$emit方法
    作用:用于子组件中触发父组件方法并传值使用://子组件中<template><button@click="handleChildEvent">子组件中触发的事件</button></template><script>exportdefault{name:'ChildComponent',methods:{handleChildEven......
  • Linux常用命令(cat,more,less,head,tail,clear,poweroff,reboot,alias,unalias,uname,hostname,hist
    本章学习Linux基础命令数量为18个123456catmorelessheadtailclearpoweroffrebootaliasunaliasunamehostnamehistorywhitchwcwwhowhoami1.cat命令作用:连接文件并在标准输出上输出(常用于查看内容较少的,会把所以查看的内容加载到内存中)。常用......
  • 体验亚马逊的 CodeWhisperer 感觉
    CodeWhisperer是亚马逊推出的辅助编程工具,在程序员写代码时,它能根据其内容生成多种代码建议。CodeWhisperer目前已支持近10几种语言,我是用java语言,用的开发工具是idea,说一下我用的情况。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案......
  • maven 问题之 no POM in this directory
    Windows上mvninstall:install-file报:noPOMinthisdirectory1、问题再现.2、解决方案方案一:.然后输入mvn命令即可mvninstall:install-file-DgroupId=com.rnny-DartifactId=rnny-tools-common-Dversion=1.0-SNAPSHOT-Dpackaging=jar-Dfile=./rnny-tools-commo......