当前位置: 首页 > news >正文

数字转换(求树的直径)

传送门

思路:


 

前置知识——树的直径:

▲定义:找到两个点,使得它们的距离最远,它们的路径就是树的直径。

▲求解:

  此类问题,需要求出以每个节点为根的子树中的最长链,取其中的最大值即为该树的最长链。

  对于每个节点,都要记录两个值: d1 [ i ] 表示以 i 为根的子树中,i 到叶子节点的距离最大值;d2 [ i ] 表示以 i 为根的子树中,除距离最大值所在子树,i 到叶子节点的最大值。(也就是次大值)。则:

  ①若 d1[ j ] + dis[ i ][ j ] > d1[ i ],则 d2[ i ] = d1[ i ];d1[ i ] = d1[ j ] + dis[ i ][ j ];

  ②否则,若 d1[ j ] + dis[ i ][ j ] > d2[ i ],则 d2[ i ] = d1[ j ] + dis[ i ][ j ];

  最后扫描所有的节点,找最大的 d1 [ i ] + d2 [ i ] 的值,就是树的直径(最长链)。


本题思路:

  预处理出每个数的约数,将可以转化的数之间连边。就可以建出一棵树,而所求的最多变换步数即为树的直径。

标程:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#include<vector>
#include<queue>
#include<deque>
#include<map>
#include<set>
using namespace std;
#define maxn 50001
#define max(a, b) ((a)>(b)?(a):(b))
typedef long long LL;
LL sum[maxn],n,d1[maxn],d2[maxn];//sum预处理每个数的约数 
LL ans=0;
inline LL read()
{
    LL kr=1,xs=0;
    char ls;
    ls=getchar();
    while(!isdigit(ls))
    {
        if(!(ls^45))
            kr=-1;
        ls=getchar();
    }
    while(isdigit(ls))
    {
        xs=(xs<<1)+(xs<<3)+(ls^48);
        ls=getchar();
    }
    return xs*kr;
}
inline void ready()
{
    for(LL i=1;i<=n;i++)
        for(LL j=2;j<=n/i;j++)
        {
            if(i*j>n) break;
            sum[i*j]+=i;
        }
}
inline void dp()
{
    for(LL i=n;i>=1;i--)//因为大数字一定是小数字的后代(逆序) 
        if(sum[i]<i)//表示i为sum[i]的子节点 
        {
            if(d1[i]+1>d1[sum[i]])//修改sum[i]的值(操作见上) 
            {
                d2[sum[i]]=d1[sum[i]];
                d1[sum[i]]=d1[i]+1;
            }
            else if(d1[i]+1>d2[sum[i]]) d2[sum[i]]=d1[i]+1;
        }
}
int main()
{
    n=read();
    ready();
    dp();
    for(LL i=1;i<=n;i++)
        ans=max(ans,d1[i]+d2[i]);//更新答案 
    printf("%lld\n",ans);
return 0;
}

 

转载于:https://www.cnblogs.com/lck-lck/p/9769701.html

相关文章:

  • 初识 vue —— 最简单的前后端交互示例
  • [orleans2.1]这是你没玩过的船新版本
  • 微信小程序picker下拉绑定数据
  • UUID、GUID、SID、SUSID
  • gradle 的jar下载到哪里了
  • [luogu4162 SCOI2009] 最长距离(最短路)
  • 034 Maven中的dependencyManagement和dependencies区别
  • 心,不能装太多;人,不能想太多
  • 深入理解spark-taskScheduler,schedulerBackend源码分析
  • 神经网络之调参
  • 数组Array的API1
  • Linux下tomcat日志打印和传参乱码问题
  • React Native vs. Cordova.
  • BigDecimal使用中的一些注意事项
  • 4 - MySQL:多表查询
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【前端学习】-粗谈选择器
  • Angular4 模板式表单用法以及验证
  • angular学习第一篇-----环境搭建
  • export和import的用法总结
  • gulp 教程
  • Javascript弹出层-初探
  • JavaScript异步流程控制的前世今生
  • magento 货币换算
  • Nacos系列:Nacos的Java SDK使用
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 安卓应用性能调试和优化经验分享
  • 从tcpdump抓包看TCP/IP协议
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 码农张的Bug人生 - 见面之礼
  • 前端相关框架总和
  • 小程序测试方案初探
  • 小李飞刀:SQL题目刷起来!
  • 应用生命周期终极 DevOps 工具包
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​io --- 处理流的核心工具​
  • ​Python 3 新特性:类型注解
  • # Java NIO(一)FileChannel
  • #laravel 通过手动安装依赖PHPExcel#
  • #mysql 8.0 踩坑日记
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)常见O(n^2)排序算法解析
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)JAVA使用POI操作excel
  • (二)换源+apt-get基础配置+搜狗拼音
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (十六)串口UART
  • (数据结构)顺序表的定义
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .NET HttpWebRequest、WebClient、HttpClient