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;
}

【树的直径 求树中距离跟阶段点最远的点】CodeForce1822F.md的更多相关文章

  1. 暴力三维树状数组求曼哈顿距离求最值——牛客多校第八场D

    涉及的知识点挺多,但是大多是套路 1.求曼哈顿距离的最值一般对所有情况进行讨论 2.三维树状数组用来求前缀最大值 /* 有一个三维坐标系(x,y,z),取值范围为[1,n],[1,m],[1,h],有 ...

  2. hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. POJ 1383 Labyrinth (树的直径求两点间最大距离)

    Description The northern part of the Pyramid contains a very large and complicated labyrinth. The la ...

  4. HDU 4123(树的直径+单调队列)

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. tyvj:1520 树的直径 spfa/树的直径

    tyvj:1520 树的直径 Time Limit: 1 Sec  Memory Limit: 131072KiBSubmit: 9619  Solved: 3287 题目连接 http://www. ...

  6. hdu 2196(方法1:经典树形DP+方法2:树的直径)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. Tyvj P1520 树的直径

    P1520 树的直径 http://www.tyvj.cn/p/1520 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结 ...

  8. 树的直径初探+Luogu P3629 [APIO2010]巡逻【树的直径】By cellur925

    题目传送门 我们先来介绍一个概念:树的直径. 树的直径:树中最远的两个节点间的距离.(树的最长链)树的直径有两种方法,都是$O(N)$. 第一种:两遍bfs/dfs(这里写的是两遍bfs) 从任意一个 ...

  9. 【模板】tyvjP1520 树的直径 [2017年5月计划 清北学堂51精英班Day3]

    P1520 树的直径 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结点的距离.每两个相邻的结点的距离为1,即父亲结点与儿 ...

  10. Building Fire Stations ZOJ - 3820 (二分,树的直径)

    大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #incl ...

随机推荐

  1. C#开发的NoteNet桌面小贴士 - 开源研究系列文章 - 个人小作品

    十多年前编写过这个NoteNet小应用,不过当时用的是文本的保存方式,而且功能上也相对较多.这次重新编写这个小应用,用上新的技术和功能.现在先把源码发布出来,在另个系列的博文中( C#基于.net f ...

  2. 一行超长日志引发的 “血案” - Containerd 频繁 OOM 背后的真相

    案发现场:混沌初现 2024年6月10日,本应是平静的一天.但从上午 9 点开始,Sealos 公有云的运维监控告警就开始不停地响.北京可用区服务器节点突然出现大量 "not ready&q ...

  3. 国芯新作 | 四核Cortex-A53@1.4GHz,仅168元起?含税?哇!!!

        获取更多T507全国产平台资料可在评论区留言或关注官方公众号~

  4. NXP i.MX 8M Mini的视频开发案例分享 (下)

    本文主要介绍i.MX 8M Mini的视频开发案例,包含基于GStreamer的视频采集.编解码.算法处理.显示以及存储案例,GigE工业相机测试说明,H.265视频硬件解码功能演示说明等. 注:本案 ...

  5. .NET CORE 部署提示 An error occurred while starting the application.

    错误提示: 解决方法 检查一下nuget引用包 是否更新了版本,如果升级或者降级了版本,需要将新的dll文件更新一下

  6. Spring5.X常见的注入方式

    使用set方法注入 Video.java package net.cybclass.sp.domain; public class Video { private int id; private St ...

  7. iOS开发基础102-后台保活方案

    iOS系统在后台执行程序时,有严格的限制,为了更好地管理资源和电池寿命,iOS会限制应用程序在后台的运行时间.然而,iOS提供了一些特定的策略和技术,使得应用程序可以在特定场景下保持后台运行(即&qu ...

  8. django 信号 新增和删除信的合用

    from django.db.models.signals import post_save, post_delete from django.dispatch import receiver fro ...

  9. VUE系列---深度解析 Vue 优化策略

    在前端开发中,性能优化一直是一个重要的课题.Vue.js 提供了多种优化策略,帮助开发者构建高性能的应用.本文将深入解析以下几个优化策略: 使用 v-once.v-if 和 v-show 的区别和优化 ...

  10. 2023/4/20 SCRUM个人博客

    1.我昨天的任务 学习了PYQT5的部分控件,例如按钮,文本框,文本编辑框,并了解了一些基础布局以及部分对窗口的自定义实现 2.遇到了什么困难 无法理解信号和槽的概念 3.我今天的任务 学习信号和槽的 ...