首页 > 其他分享 >半树问题

半树问题

时间:2023-10-06 20:15:28浏览次数:29  
标签:sz idx int ll 半树 问题 m1 m2

半树问题

我们考虑每条边的贡献就是所有经过它的路径,恰好分成这条边的子树内的点、子树外的点两组,路径的端点一定是这两组点中各取一个点。乘起来再乘上边权,就是这条边的贡献。

于是问题被转换成了在树上选取最长的路径了,这就是树的直径问题。

考虑到边权可能为负,我们采用树形DP,对于每个点,求它向下的点中最深和次深的,可以发现枚举到了所有的拐点,所以是正确的。

#include<cstdio>
#include<cstring>
using namespace std;
const int N=100010,M=2*N;
int n,h[N],e[M],ne[M],idx,sz[N],p[N];
typedef long long ll;
ll w[M],ans,ans2;
void add(int a,int b,int c){
	w[idx]=c,e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int x){
	sz[x]=1;
	for(int i=h[x];~i;i=ne[i]){
		int j=e[i];
		dfs(j);
		sz[x]+=sz[j];
	}
}
ll dfs1(int x){
	ll m1=0,m2=0;
	for(int i=h[x];~i;i=ne[i]){
		int j=e[i];
		ll t=dfs1(j)+w[i];
		if(t>=m1)m2=m1,m1=t;
		else if(t>m2)m2=t;
	}
	if(m1+m2>ans2)ans2=m1+m2;
//	printf("%lld %lld\n",m1,m2);
	return m1;
}
int main(){
	freopen("halftree.in","r",stdin);
	freopen("halftree.out","w",stdout);
	scanf("%d",&n);
	memset(h,-1,n*4+4);
	for(int i=2;i<=n;++i)scanf("%d",p+i);
	for(int i=2;i<=n;++i){
		int c;
		scanf("%d",&c);
		add(p[i],i,c);
	}
	dfs(1); 
	for(int i=0;i<idx;i++)w[i]=1ll*(w[i]>>1)*(n-sz[i+2])*sz[i+2],ans+=w[i]*2;
//	for(int i=0;i<idx;++i)printf("%lld ",w[i]);
	dfs1(1);
	printf("%lld",ans-ans2);
	return 0;
}

标签:sz,idx,int,ll,半树,问题,m1,m2
From: https://www.cnblogs.com/wscqwq/p/17744918.html

相关文章

  • 动态规划问题(1)子数组系列
    这几天刷了子数组系列的动态规划题目,在这里写下这篇博客,总结记录一下做这些题目的经验,同时也相当于复习。题目一:最大子数组和题目链接:53.最大子数组和-力扣(LeetCode)当我们看完题目,看完例题之后,发现是一个动态规划的子数组问题。那么做动态规划问题有五步第一步:状态表示对于这种......
  • [Qt] vs 2022写qt解决"常量中有换行符"编译报错问题!
     像上面这种问题是由于文件的编码格式是中文(GB2312)格式,导致编译报错。在VS中,改成UTF-8就能解决。 1.点击VS菜单栏的高级编译选项低版本的在"文件"菜单选项下面,VS2022需要自己手动开启显示(1)工具->自定义选择工具,选中菜单栏添加命令类别选择"文件",命令找......
  • 算法之动态规划(DP)求解完全背包问题(状态转移式方程推导)
    完全背包是01背包的进阶版。在这里补充一下代码随想录的完全背包状态转移式的推导。有兴趣的可以先看一看原版。状态转移方程状态:dp[i][j]选择前i个物品,容量为j的背包时所选物品价值总和最大。状态转移:dp[i][j]=max(dp[i-1][j-k*v[i]]+k*w[i])(k=0,1,2,3...)(j-k*v......
  • sv的LSB 使用+SV的protect类型+RAL模型的lock原因+C语言结构体中的冒号用法+uvm版本在
    sv的LSB使用https://blog.csdn.net/gsjthxy/article/details/90722378等价关系[LSB+:STEP]=[LSB+STEP:LSB]伪代码:bit[1023:0]mem;bit[7:0]data;j=0..100mem[j*8+:8]=data;//[7:0],[15:8],[23:16]SV的protect类型https://blog.csdn.net/qq_37573794/ar......
  • Spring与MyBatis集成中遇到的问题
    1、依赖版本问题描述在进行Spring框架于MyBatis框架集成时需要使用xml文件装配sqlSessionFactory为bean,从而自动获取sqlSession。遇到了sqlSessionFactory装配失败的问题报错信息Causedby:org.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwi......
  • 机器人农场需要解决以下几个问题
    机器人农场需要解决以下几个问题:技术问题:机器人农场需要先进的机器人技术,包括自主导航、物体识别、操作灵活性、适应各种环境的能力等。此外,还需要人工智能和机器学习技术,以便机器人能够学习和改进其性能。资金问题:机器人农场的建立和维护需要大量资金。除了购买机器人设备外,还需......
  • 解决IDEA中.properties文件中文变问号(???)的问题(已解决)
    问题背景构建SpringBoot项目时,项目结构中有一个application.properties文件。这个项目是SpringBoot一个特有的配置文件。内容如下(我写了一些日志的配置):写到这刚好到饭点,我打算回来吃个饭继续写,于是关闭了IDEA当我吃完回来打开电脑,发现刚写的代码变成这样:玛德,我汉字呢???解决......
  • neovim的插件管理器vim-plug导致代码颜色不显示问题解决
    neovim的帮助文件路径F:\Programs\Neovim\share\nvim\runtime\docruntimepath的帮助文档路径F:\Programs\Neovim\share\nvim\runtime\doc\options.txt$VIM环境变量$VIM被用来确定Vim中不同的用户文件的位置,比如用户启动脚本“.vimrc”。这个是系统设置,详见startup。允许每......
  • 算法题:牛牛的三元组问题
    牛牛的三元组问题_牛客题霸_牛客网描述动物牛牛是一个勇敢的冒险家,它正在探索一个神秘的岛屿。岛上有许多宝藏,但是宝藏被隐藏在一系列数字中。牛牛找到了一个整数数组 nums,它相信这个数组中存在一些特殊的三元组,满足以下条件:三元组的和等于0。三元组中的元素不能重复。牛牛想按照......
  • 一文彻彻底底弄懂优化问题
        优化问题,几乎可以涵盖方方面面,例如:如何配比使得化学配方效果最好、成本最优,如何组合用料使得用料最少,如何安排行车路线使得距离最短(TSP问题)、如何装载使得空间利用率最高(FTP问题、背包问题)等等。优化问题普遍来说都是NP难题,关于NP难题的数学定义这里不做赘述,只需知道NP......