首页 > 其他分享 >【树的直径 求树中距离跟阶段点最远的点】CodeForce1822F.md

【树的直径 求树中距离跟阶段点最远的点】CodeForce1822F.md

时间:2024-08-04 21:50:32浏览次数:4  
标签:md dist int text CodeForce1822F fa 求树 c1 include

CF1822F-Problem - F - Codeforces

题目大意:无根树的每条边为k,定义操作:移动根节点为把当前的根ROOT移动到相邻节点,每次代价为c,

定义成本=从ROOT出发到达的最长的路径的长度,利润=成本-代价,求利润最大值

\[\begin{align} &\huge\color{red}记得开\text{longlong}\\\\\\ & \huge思路\\ & 1.建图 默认根\text{Root}=1,跑一遍dfs 记录每个点到\text{Root}的距离\text{dist}_1{i}\\ & 距离\text{Root}最远的点是c_1 \\ & 如果k\le c,不移动边,因为移动后ans减小 \\ & 否则:以c_1为\text{Root}跑dfs,记\text{dist}_2{i}是到c_1的距离,距离c1最远的点是c_2\\ & 以c_2为\text{Root}跑dfs,记\text{dist}_3{i}是到c_2的距离 \\ & 此时c_1,c_2就是树的直径\\ & 如果可以移动,必然是移动到某个直径\\ &此时的的成本W=\text{max}(\text{dist}_2{i},\text{dist}_3{i}) \times k,代价就是从\text{root}=1到现在的节点的偏移量\text{dist}_1{i}\\ &因此答案Ans = max(Ans,W-c\times\text{dist}_1{i})\\\\\\ &\huge\color{red}记得开\text{longlong} \end{align} \]

#include <cstdio>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#define ep emplace_back 

#define lld long long 
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0); 
#define vec vector 
const int N = 2e5+9;
const int INF = 0x7FFFFFFF; //2147483647

const int inf1 = 0x3f3f3f3f; //1061109567
const int inf2 = 0x7f7f7f7f; //2139062143 memset赋值用

using namespace std;
int head[N],idx=0;
bool vis[N];
struct node{
    int to,val,next;
};
node e[N<<1];
int n,m,k,c;
int c1,c2,c3,c4;
int dist1[N],dist2[N],dist3[N];
void add(int u,int v,int val){
    e[idx] = {v,val,head[u]};
    head[u] = idx++;
}

void clear9(){
    memset(head,-1,sizeof(head));
    memset(dist1,0,sizeof(dist1));
    memset(dist2,0,sizeof(dist2));
    memset(dist3,0,sizeof(dist3));
    idx=0;
    c1=c2=c3=c=0;
}
void bd(){
    cin>>n>>k>>c;
    for(int i=1 ; i<=n-1 ; ++i){
        int u,v;
        cin>>u>>v;
        add(u,v,1);
        add(v,u,1);
    }
}

void dfs1(int u,int fa){
    for(int i=head[u]; i!=-1 ; i=e[i].next){
        int v = e[i].to;
        if(v!=fa){
            dist1[v] = dist1[u] +1;
            if(dist1[v] > dist1[c1])
                c1=v;
                dfs1(v,u);
        }
    }
}
void dfs2(int u,int fa){
    for(int i=head[u]; i!=-1 ; i=e[i].next){
        int v = e[i].to;
        if(v!=fa){
            dist2[v] = dist2[u] +1;
            if(dist2[v] > dist2[c1])
                c2=v;
                dfs2(v,u);
        }
    }
}
void dfs3(int u,int fa){
    for(int i=head[u]; i!=-1 ; i=e[i].next){
        int v =e[i].to;
        if(v!=fa){
            dist3[v] = dist3[u] +1;
            if(dist3[v] > dist3[c1])
                c3=v;
                dfs3(v,u);
        }
    }
}
void solve(){
    clear9();
    bd();
    dfs1(1,0);
    dfs2(c1,0);
    dfs3(c2,0);
    //三次dfs
    //开longlong可以用 ans去乘以1ll
    lld ans=0;
    if(k<c){
        ans=(lld)dist1[c1]*k;
    }
    else{
        for(int i=1;  i<=n;++i){
            int dis=max(dist2[i],dist3[i]);
            ans = max(ans,(lld)k*(dis)-(lld)c*dist1[i]);
    }
    }
    cout<<ans<<"\n";
};


int main(){
    ios;
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

标签:md,dist,int,text,CodeForce1822F,fa,求树,c1,include
From: https://www.cnblogs.com/Phrink734/p/18342246

相关文章

  • mdmmigrator.dll文件丢失导致程序无法运行问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个mdmmigrator.dll文件(挑选合适的版本文件)把......
  • ARM和AMD介绍
    一、介绍ARM和AMD都是计算机领域中的知名公司,它们在不同方面具有重要的影响和地位。ARM(AdvancedRISCMachine):ARM公司是一家总部位于英国的公司,专注于设计低功耗、高性能的处理器架构。ARM架构以其精简指令集(RISC)而闻名,被广泛用于移动设备、嵌入式系统、物联网设备等领域。......
  • cmd最全命令.收藏必备
    平台windowsWindows命令提示符(cmd.exe)是WindowsNT下的一个用于运行Windows控制面板程序或某些DOS程序的shell程序;或在WindowsCE下只用于运行控制面板程序的外壳程序。   历史在Windows2000以前的Windows系统中没有此文档;command.com即是此文......
  • mfc用printf输出调试信息到终端cmd
    前言全局说明mfc用printf输出调试信息到终端cmd一、说明环境:Windows11家庭版23H222631.3737VS2013二、printf打印调试信息2.1设置启用控制台打印2.1.1打开解决方案(项目)--属性2.1.2配置属性->生成事件->后期生成事件->命令行->编辑在框里填入......
  • 在cmd/powershell中使用java/javac -cp/--class-path命令链接多个jar包
    ​ 之前使用ide,习惯了傻瓜式一键运行java文件,对于java虚拟机以及java指令了解的很少,最近重温java,在使用windows中的cmd来运行java项目时,遇到了一点问题,相同的指令在cmd中能够运行,在powershell中不能正确运行,在国内网站上搜索无果后,果断去国外,在stackoverflow上找到解决办法。​ ......
  • 自定义的 systemd 服务启动方式
    目录systemd单元文件(UnitFile)单元文件结构示例单元文件1.基础单元文件2.带有环境变量的单元文件3.自定义的ExecStartPre和ExecStartPost配置管理日志管理1.系统日志:2.应用程序日志:3.用户日志:使用prometheus配置实例1.配置prometheus2.配置alertmana......
  • Linux路径的概念及目录的操作命令 cd、pwd、mkdir、rmdir
    本文主要介绍Linux系统中路径的基本概念以及对目录的基础操作。根目录的概念在Windows操作系统中,是由盘符开始描述路径,如:C:\Programs\abc\或者D:\game\abc\。在Linux操作系统中,则是以目录树的形式展现,所有的文件及目录都是从根目录/开始的,如/home,/etc等,即便是有多......
  • Marker效果试用,也是pdf2md
        主要原理Marker的工作原理基于深度学习模型。它首先通过OCR技术(如果需要的话)提取文本(采用启发式算法和tesseract工具),然后检测页面布局并确定阅读顺序(使用布局分割器[1]和列检测器[2])。接下来,Marker会对每个文本块进行清洁和格式化处理(运用启发式算法和nougat[3......
  • md5绕过总结
    1.万能密码md5($pass,true)传入ffifdyop,这个字符串经过md5加密后为276f722736c95d99e921722cf9ed621c在转为字符串为'or'6�]��!r,��b用途:$password=$_POST['password'];$sql="SELECT*FROMadminWHEREusername='admin'andpassword='".m......
  • x-cmd pkg | nvim - 命令行文本编辑器,Vim 的一个现代化分支
    目录简介快速入门功能特点Neovim插件推荐相关竞品进一步阅读简介Neovim(简称nvim)是用C语言开发的文本编辑器,是Vim的一个现代化分支,更专注于提升可扩展性和提供更现代的用户体验。它是基于Vim源代码的一个衍生版本,不是一个从头开始重写Vim或将其转换为IDE......