zoukankan      html  css  js  c++  java
  • LOJ 10155

    前言

    从现在开始,这个博客要写一些题解了。起初,开这个博客只是好玩一样,没事就写写CSS、JS,然后把博客前端搞成了现在这个样子。以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响,突然觉得写解题报告也很有意思,以后基本上做的题,除了太水的,都会在这上面更新。

    一直很想买一个域名,然后用博客框架搭一个自己的博客,以前用 WordPress 和 Hexo 都搭过博客,但是域名续费、虚拟主机(虽然可以用 Hexo+GithubPage/CodingPage 搭静态博客,但更新不方便,也没法随时更新,例如在机房,所以还是需要 WordPress 等框架)的花费和阅读量比太小,没必要去搭,也试过用免费的虚拟主机(000webhost),免费的域名(.tk .cf 等),但毕竟免费,速度慢,网页有水印(虽然屏蔽了),域名国内搜索引擎还不予收录,所以就丢弃了。目前会用这个博客园的博客,而且可能会用下去(其实现在阅读体验和私有博客也没什么大的区别了)。

    说了这么多,进入正题吧。

    题面

    传送门

    如果一个数 $x$ 的约数和 $y$ (不包括他本身)比他本身小,那么 $x$ 可以变成 $y$ , $y$ 也可以变成 $x$ 。例如 $4$ 可以变为 $3$ , $1$ 可以变为 $7$ 。限定所有数字变换在不超过 $n$ 的正整数范围内进行,求不断进行数字变换且不出现重复数字的最多变换步数。

    解题思路

    这道题的标签是树形DP,但有一种更简便的做法。

    首先我们可以预处理出 1~n 之间的转换关系,然后连边,形成一张图。

    例如 4 的因数和是 3 ,那么 4 和 3 可以相互转换,那么在它们之间连一条有向边。

    预处理完以后,我们得到了一张图。这个问题被转化成了求这张图的最长链。

    那么怎么求图上的最长链呢?

    从图上的任意一个结点开始,找到离这个结点最远的结点。然后再从这个结点找出离它最远的结点,它们之间的距离就是最长链的长度。

    很明显,用 dfs 就可以求出最长链的长度了。我们首先从 1 开始 dfs(因为不管 n 是多少,点 1 必然存在),找到离它最远的结点,然后再 dfs 一遍,找到最远的结点就是答案。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    long long last[200005],to[200005],nextt[200005],v[200005],top=0,d[200005];
    long long maxx=0,ans=0;
    void add(int a,int b){//前向星 
        nextt[++top]=last[a];
        to[top]=b;
        last[a]=top;
    }
    int n;
    void dfs(int x,int t){
    	v[x]=1;
    	if (t>maxx){//如果当前的距离大于已知最长距离,那么更新距离并记录当前结点 
    		maxx=t;
    		ans=x;
    	}
    	for (int i=last[x];i;i=nextt[i]){//搜索与当前结点有联系的结点 
    		if (!v[to[i]]){
    			dfs(to[i],t+1);
    		}
    	}
    }
    int main(){
    	cin>>n;
    	for (int i=2;i<=n;i++){//预处理 
    		int tmp=1;
    		for (int j=2;j<=sqrt(i);j++){
    			if (i==j){
    				break;
    			}
    			if (i%j==0){
    				tmp+=j+i/j;
    			}
    		}
    		if ((int)sqrt(i)*(int)sqrt(i)==i){
    			tmp-=sqrt(i);
    		}
    		if (tmp>=i){//如果约数和大于等于其本身,那么跳过 
    			continue;
    		}
    		add(i,tmp);
    		add(tmp,i);
    	}
    	dfs(1,0);
    	maxx=0;
    	memset(v,0,sizeof(v));
    	dfs(ans,0);
    	cout<<maxx;
    }
  • 相关阅读:
    nginx 403 forbidden 二种原因
    【Spring-AOP-学习笔记-3】@Before前向增强处理简单示例
    【Oracle学习笔记-5--】集合操作之union,intersect和minus操作
    【Oracle学习笔记-2】Oracle基础术语解析
    【数据库设计-1.2】主键的设计
    【数据库设计-1.1】关系的实现
    【Servlet和JSP-学习-1】基础知识
    【Spring学习笔记-MVC-17】Spring MVC之拦截器
    【Spring学习笔记-MVC-1.0】Spring MVC架构介绍
    【Spring学习笔记-MVC-16】Spring MVC之重定向-解决中文乱码
  • 原文地址:https://www.cnblogs.com/abc2237512422/p/10343519.html
Copyright © 2011-2022 走看看