当前位置: 首页 > news >正文

AT_abc409_e [ABC409E] Pair Annihilation

AT_abc409_e [ABC409E] Pair Annihilation

赛时没开longlong挂了。

思路

首先我们可以把这棵树转化为一颗有根树,且所有电子的都朝根节点移动。

那么接下来我们就需要选择一个最优的树根。

考虑换根dp。

但是可以发现换根时答案其实是没有变化的。

我们设 f i f_i fi 表示以 i i i 为根的子树电子全部集中到 i i i 所耗费的能量, g i g_i gi 表示以 i i i 为根的子树电子全部集中到 i i i 后的电子数量。

图片

如图所示,我们设一号节点与二号节点之间的距离为 v v v,当我们要把根从 1 换到 2 时,相当于将原本要从 2 号节点移动到 1 号节点的电子留在 2 号,其他电子在 1 号节点,此时只有 1 号节点和 2 号节点存在电子。

我们设此时 1 号节点的电子数量(此处负电子数量算作负数)为 a a a,2 号节点的电子数量为 b b b,那么有 a + b = 0 a+b=0 a+b=0 ∣ a ∣ = ∣ b ∣ |a|=|b| a=b,那么此时无论我们把电子从 2 号节点移动到 1 号节点还是从 1 号节点移动到 2 号节点对答案产生的贡献是不变的,所以我们可以直接以任意节点为根跑dfs求出答案。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a[100010],f[100010],g[100010];
struct N{ll y,v;
}; 
vector<N> e[100010];
void dfs(int x,int xfa){f[x]=0;g[x]=a[x];//g要初始化为当前节点电子数量 for(N y:e[x])if(y.y!=xfa){dfs(y.y,x);//遍历子节点 f[x]+=f[y.y]+abs(g[y.y])*y.v;//更新f g[x]+=g[y.y];//更新g }
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1,x,y,v;i<n;i++){cin>>x>>y>>v;e[x].push_back({y,v});//建树 e[y].push_back({x,v});}dfs(1,0);//dfs求f,g数组 cout<<f[1];//此处我们以1为根,所以输出f[1] return 0;
}

相关文章:

  • 【JAVA】javadoc —— 如何生成标准的 Java API 文档
  • 12.7Swing控件6 JList
  • SQL Server从入门到项目实践(超值版)读书笔记 16
  • 用 DeepSeek 高效完成数据分析与挖掘
  • 时序数据库IoTDB结合SeaTunnel实现高效数据同步
  • 浅谈未来汽车电子电气架构发展趋势中的通信部分
  • 码蹄杯真题分享
  • LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
  • 前端现行架构浅析
  • masm32汇编实现扫雷进程注入
  • 深入理解 x86 汇编中的符号扩展指令:从 CBW 到 CDQ 的全解析
  • Chainlink Automation 深度解析与实战
  • 【算法】【优选算法】优先级队列
  • LUFFY(路飞): 使用DeepSeek指导Qwen强化学习
  • 27、基于map实现的简易kv数据库
  • 第二部分 方法,还是方法——“信管法则”的四大要点
  • 求解一次最佳平方逼近多项式
  • 28、元组的遍历
  • XXL-JOB——源码分析解读(1)
  • 勒让德多项式
  • 网站营销的优势/凡科建站官网
  • 不同用户入口的网站样板/宁波seo外包方案
  • 西安市规划建设局网站/爱站网关键词挖掘查询
  • 来个网站吧好人一生平安百度贴吧/推广计划怎么做
  • 邢台移动网站建设服务/seo一键优化
  • 深圳做官网的公司/seo公司 上海