首页 > 其他分享 >P1131 [ZJOI2007] 时态同步

P1131 [ZJOI2007] 时态同步

时间:2023-03-12 20:23:34浏览次数:55  
标签:时态 ch const int define ZJOI2007 P1131 dp dis

P1131 [ZJOI2007] 时态同步 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这更多是一个思维题

 

 

 看到上面这副图,我们的想法是先让 1→2和1→3拉伸到1→4的深度,再让5→1的叶子拉伸到5→6

我们便令dis[x]为x子树中最深的深度,对x节点进行操作

我们已经在v子树的操作中让v子树的每个叶子都是深度都是等深的

令dp[x]为让x子树中每个叶子等深所需的操作次数,当然这题不是树形dp,但用到树形dp的思想

接下来便是让x子树中每个叶子等深,所以我们先要找到最深的叶子max(dis[v]+val[x][v]),令他们的距离为dis[x];

然后让v子树拉伸,拉伸的长度为:dis[x]-(dis[v]+val[x][v])。

统计dp[x]+=dp[v]+(dis[x]-(dis[v]+val[x][v]);

Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   
#define popb pop_back  
#define fi first
#define se second
const int N=5e5+10;
//const int M=;
//const int inf=0x3f3f3f3f;     
//const ll INF=0x3ffffffffffff;
int T,n,root;
ll dp[N],dis[N];
vector<int> g[N],val[N]; 
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
void dfs(int x,int fa)
{
    for(int i=0;i<g[x].size();i++)
    {
        int v=g[x][i];
        if(v==fa) continue;
        dfs(v,x);
        dis[x]=max(dis[x],dis[v]+val[x][i]);
    }
    for(int i=0;i<g[x].size();i++)
    {
        int v=g[x][i];
        if(v==fa) continue;
        dp[x]+=(dp[v]+dis[x]-dis[v]-val[x][i]);
    }
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);
    n=read();root=read();
    for(int i=1;i<n;i++)
    {
        int u=read(),v=read(),t=read();
        g[u].pb(v);val[u].pb(t);
        g[v].pb(u);val[v].pb(t);
    }
    dfs(root,0);
    printf("%lld",dp[root]);
    return 0;
}

 

标签:时态,ch,const,int,define,ZJOI2007,P1131,dp,dis
From: https://www.cnblogs.com/Willette/p/17208968.html

相关文章

  • 「ZJOI2007」仓库建设
    「ZJOI2007」仓库建设题意:有\(n\)个工厂,由高到底分布在一座山上,工厂\(1\)在山顶,工厂\(n\)在山脚,第\(i\)个工厂有\(p_i\)件产品,距离工厂\(1\)的距离为\(x_i\)......
  • 英语时态
    2022.12.14--12.27英语时态 一般时态do现在进行时bedoing现在完成时bedone过去时done过去进行时bedoing过去完成时benedone将来时wi......
  • ZJOI2007 时态同步 树形dp
    题面简述给定以\(s\)为根的一棵树,可以进行代价为1的操作使一条边权+1,求最小代价使得根节点到所有叶子节点距离相等。分析令\(sum[x]\)表示以\(x\)为子树的最大距离(根->......
  • 时态
    英语的4时4态时:动作发生的时间(现在,过去,将来,过去将来)态:动作的属性(一般情况,正在进行,还是已经完成,或者完成进行)基本逻辑框架时\态一般进行完成完成进行现在一......
  • P2272 [ZJOI2007]最大半连通子图
    原题链接题目的意思就是说找到最长路径的长度及数量。显然,我们首先要tarjan缩点,然后建立新图,但要注意的是不能有重边,因为会影响我们计算数量,那我们可以用map记录一下两点......
  • 【ZJOI2007】捉迷藏(动态树分治)
    显然只有一次询问的话,可以用点分治来实现。但是现在我们有多组询问,还带有修改,我们只能通过动态点分治来做了。动态点分治的主要思想:省去每次点分治求重心的过程,直接预处......
  • P2272 [ZJOI2007]最大半连通子图
    哎,这道题打了半个小时,调了两个小时,最后发现竟然是把\(Tarjan\)里\(while\)给打成\(if\),呜呜,枉费我两个小时时间,所以下次一定要记住不能打成\(if\)(估计也就我一个......
  • 将来时态
    现在进行时表将来:whatareyoudoingtomorrow?现在进行时:be+v-ing可以表示现在正在做的事情,也可以表示将来要做的事情      一般现在时也可以表将来,但主......
  • 动词时态=>1.动作的时间和状态
    时态什么是时态?英语的时态,是由动作的时间+动作的状态;这俩一起构成了时态动词的时间和状态在一起,合称时态理论上的十六种时态先将时间和状态的概念搞清楚,再具体讨......
  • 动词时态=>2.动作的时间状态结合
    动作和时间结合现在的四种时态现在进行时态对于现在这个时间点,这个动作还在进行当中例如:我现在正在喝水现在完成时态对于现在这个时间点,这个动作已然完成......