首页 > 其他分享 >P3478 [POI2008] STA-Station

P3478 [POI2008] STA-Station

时间:2024-03-19 22:14:29浏览次数:16  
标签:STA sizes ll next fa Station 节点 now P3478

原题链接

WARNING!!! 使用map代替数组不再可靠,因为map的插入查找修改复杂度均为 \(O(logn)\) ,即使unorder_map也不行!!!

题解

我们发现,当一个节点的深度之和已知时(这里认为是根节点),其相邻节点的深度之和也可通过某种方程转移而得,有人称这种方法为换根DP

具体的,将树拆开成图(求深度之和的时候是树),已知节点 \(A\) 向右边相邻一条节点 \(B\) 移动,等价于 \(A\) 左边的节点(包括 \(A\) )到 \(A\) 之后再往右走一步,左边少走一步
怎么表示这个左边右边的节点呢?

再回到树的视角,等价于 \(f[B]=f[A]-size[B]+n-size[B]\) 其中 \(size[B]\) 代表 \(B\) 的子树大小

因为树中父节点与子节点的大头针插入式的边才有这样的感觉??

code

#define ll long long
#include<bits/stdc++.h>
using namespace std;
vector<ll> G[1000005];
ll sizes[1000005],depth[1000005],dp[1000005];
ll n;

void dfs1(ll now,ll fa)
{
    sizes[now]=1;
    depth[now]=depth[fa]+1;
    for(auto next:G[now])
    {
        if(next==fa) continue;
        dfs1(next,now);
        sizes[now]+=sizes[next];
    }
}

void dfs2(ll now,ll fa)
{
    for(auto next:G[now])
    {
        if(next==fa)continue;
        dp[next]=dp[now]-sizes[next]+(n-sizes[next]);
        dfs2(next,now);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(ll i=1;i<n;i++)
    {
        ll x,y;
        cin>>x>>y;
        G[x].emplace_back(y);
        G[y].emplace_back(x);
    }

    dfs1(1,0);
    for(ll i=1;i<=n;i++) dp[1]+=depth[i];
    dfs2(1,0);

    ll ans=0,id;
    for(ll i=1;i<=n;i++)
    {
        if(dp[i]>ans)
        {
            ans=dp[i];
            id=i;
        }
    }

    cout<<id;
    return 0;
}

标签:STA,sizes,ll,next,fa,Station,节点,now,P3478
From: https://www.cnblogs.com/pure4knowledge/p/18084077

相关文章

  • 【UML建模】状态图(State Machine Diagram)
    原文链接:https://blog.csdn.net/qq_38249409/article/details/1299584681.概述状态图,又称为状态机图,是一种用于描述对象的生命周期和状态转换的UML图示,它是一种行为图,用于描述对象的状态和状态之间的转换。这里的对象大多数情况是指的类生成的对象,但是有时候也会代表对象、参与者......
  • Cannot connect to already running IDE instance. Exception: Process 6,367 is stil
    当IntelliJIDEA显示“CannotconnecttoalreadyrunningIDEinstance.Exception:Process6,367isstillrunning”这个错误消息时,意味着它试图连接到一个已经在运行中的实例,但因为某些原因,这个操作失败了。这通常发生在IDEA无法正常关闭或在后台无法正确管理其进程......
  • C++ static
    1.隐藏(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。如果加了static,就会对其它源文件隐藏。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static可以用作函数和变量的前缀,对于函数来讲,sta......
  • Java中static
    一、被static修饰的成员变量叫做静态变量特点:被该类所有对象共享,不属于对象,属于类,随着类的加载而加载,优先于对象存在调用方式:1.类名调用   2.对象名调用二、被static修饰的成员方法,叫做静态方法特点:多用在测试类和工具类中,JavaBean类中很少会用调用方式:1.类名调用 ......
  • C++ static和const
    const定义的常量在超出其作用域之后其空间会被释放;static定义的静态常量在函数执行后不会释放其存储空间;1.staticstatic表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员......
  • const,static深度总结——c++穿透式分析
         前言;c++类和对象的知识点中除了几种默认函数,比较重要的还有使用const和static修饰成员相关知识点。const在c++中特性很简单。但是在使用中,比较容易疏忽大意出现问题。static特性也很简单,但是比起const来要直接的多。在使用中只要熟练语法以及底层原理。就......
  • 【无人机路径规划】基于IRM和RRTstar进行无人机路径规划(Matlab代码实现)
    ......
  • Bostan-Mori 算法
    EI哥哥科普到OI界的科技……最近出现了基于这个的多项式复合/复合逆复杂度的突破,所以今天去看了一下。这是一个用于解决多项式有理分式的单项系数问题\([x^n]\frac{P}{Q}\)的算法。该算法在解决常系数齐次线性递推问题时,代码明显短很多,常数相较原方法极其优越。首先我们考......
  • stack和queue
    stack的介绍1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,......
  • 【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack
    AzureAppService.NETProfiler在AppService服务中,如果部署了.NET应用,平台有一个非常好的工具可以查看请求的性能分布及异常时的StackTraces。进入路径:AppServiceAzureOverview-->  Networking(网络)-->Troubleshoot(排除故障)--> Collect.NETProfilerTrace......