洛谷P1131 【ZJOI2007】时态同步

本文介绍了一种利用树形动态规划方法解决特定时态同步问题的算法实现。通过对树状结构进行分析,定义状态转移方程,计算使整棵树时态同步所需的最小操作次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目传送门

这道题还是能比较容易的看出来它的树形结构的,时间即为边的长度,而且很显然的是,如果以 x x 为根的子树已经时态同步,那么以x的儿子为根的子树肯定也已经时态同步,也就是说我们可以从 x x 的儿子的状态推到x的状态,所以我们考虑树形DP。设 f[i] f [ i ] 表示在以 i i 为根的子树中达成时态同步需要最少用几次道具。

那么对于一个f[son[x]]已经全部计算完毕的节点 x x ,如何计算f[x]呢?要想让以 x x 为根的子树时态同步,需要将所有的叶节点到x的距离修改为这些距离里的最大值,也就是使用道具。所以我们需要记录这棵子树中叶节点到根的距离的最大值,并对其他子树进行修改(其实这一步不用真的写),同时更新 f[x] f [ x ] 。设以 i i 为根的子树里,所有叶节点中到根的最大距离是t[i] f[i]=t[i](t[j]+len[i,j])+f[j] f [ i ] = ∑ t [ i ] − ( t [ j ] + l e n [ i , j ] ) + f [ j ] j j i的儿子。

最后别忘了开 longlong l o n g l o n g

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=500000;
int n,rt,top,pre[(N<<1)+10],to[(N<<1)+10],len[(N<<1)+10],h[N+10];
long long f[N+10],t[N+10];
void ins(int u,int v,int w)
{
    pre[++top]=h[u];h[u]=top;to[top]=v;len[top]=w;
}
void dfs(int x,int fa)
{
    for(int i=h[x];i;i=pre[i])
    {
        int v=to[i];
        if(v==fa)continue;
        dfs(v,x);
        t[x]=max(t[x],t[v]+len[i]);
    }//计算t[x]
    for(int i=h[x];i;i=pre[i])
    {
        int v=to[i];
        if(v==fa)continue;
        f[x]+=f[v]+t[x]-t[v]-len[i];
    }//计算f[x]
}
int main()
{
    scanf("%d%d",&n,&rt);
    for(int i=1;i<n;i++)
    {
        int x,y,z;scanf("%d%d%d",&x,&y,&z);
        ins(x,y,z);ins(y,x,z);
    }
    dfs(rt,0);
    printf("%lld\n",f[rt]);return 0;
}
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在 Android 应用开发中,开发一款仿 OPPO 手机计算器的应用是极具实践价值的任务,它融合了 UI 设计、事件处理以及数学逻辑等多方面的技术要点。当前的“最新版仿 OPPO 手机计算器--android.rar”压缩包中,提供了该计算器应用的源代码,这为开发者深入学习 Android 编程提供了宝贵的资源。 UI 设计是构建此类计算器应用的基石。OPPO 手机的计算器界面以清晰的布局和良好的用户交互体验著称,其中包括数字键、运算符键以及用于显示结果的区域等关键元素。开发者需借助 Android Studio 中的 XML 布局文件来定义这些界面元素,可选用 LinearLayout、GridLayout 或 ConstraintLayout 等布局管理器,并搭配 Button 控件来实现各个按键功能。同时,还需考虑不同分辨率屏幕和设备尺寸的适配问题,这通常涉及 Density Independent Pixel(dp)单位的应用以及 Android 尺寸资源的合理配置。 事件处理构成了计算器的核心功能。开发者要在每个按钮的点击事件中编写相应的处理代码,通常通过实现 OnClickListener 接口来完成。例如,当用户点击数字键时,相应的值会被添加到显示区域;点击运算符键时,则会保存当前操作数并设定运算类型。而对于等号(=)按钮,需要执行计算操作,这往往需要借助栈数据结构来存储操作数和运算符,并运用算法解析表达式以完成计算。 数学逻辑的实现则是计算器功能的关键体现。在 Android 应用中,开发者可以利用 Java 内置的 Math 类,或者自行设计算法来完成计算任务。基本的加减乘除运算可通过简单的算术操作实现,而像求幂、开方等复杂运算则需调用 Math 类的相关方法。此外
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值