$Loj10155$ 数字转换(求树的最长链) 树形$DP$
Description
如果一个数x的/约数和/y(不包括他本身)比他本身小,那么x可以变成y,y 也可以变成x.限定所有数字变换在不超过n的正整数范围内进行,求不断进行数字变换且不出现重复数字的最多变换步数.
注意断句QwQ,是x的/约数和/y,不是x的约数/和/y
Sol
先预处理出每个数的约数和,将可以转换的数连边
可将数x的约数和y看成x的父结点,将以x为约数和的数看成x的子结点,这显然是一棵树
题目也就转换成了求这棵数的最长链
对于结点x,只要维护 在以之为根的树内 一端为x的 最长链与次长链即可
(感觉上面那句话写得很凌乱,所以就自己打空格断句了)
具体来说,d1[x]表示最长链的长度,d2[x]表示次长链的长度,y是x的孩子
if(d1[y]+1>d1[x]) d2[x]=d1[x],d1[x]=d1[y]+1;
else d2[x]=max(d2[x],d1[y]+1);
之前在想为什么不是 if(d1[y]+1>d1[x]) d2[x]=max(d1[x],d2[y]+1),d1[x]=d1[y]+1;
也就是为什么y的次长链不能更新x的次长链,发现其实d1[x]与d2[x]不能x的同一棵子树中的!
画图理解一下
如果d1[1]和d2[1]都在右子树中,那么d1[1]+d2[1]所构成的链是图中红色箭头所表示的那样,实际并不能算是树中的一条链
Code
#include<iostream>
#include<cstdio>
#define Rg register
#define il inline
#define go(i,a,b) for(Rg int i=a;i<=b;++i)
#define yes(i,a,b) for(Rg int i=a;i>=b;--i)
using namespace std;
il int read()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
const int N=;
int n,ans,a[N],d1[N],d2[N];
int main()
{
n=read();
go(i,,n)
go(j,,n/i)a[i*j]+=i;
yes(x,n,)
{
int y=a[x];if(y>=x)continue;
if(d1[y]<d1[x]+){d2[y]=d1[y],d1[y]=d1[x]+;}
else d2[y]=max(d2[y],d1[x]+);
}
go(i,,n)ans=max(ans,d1[i]+d2[i]);
printf("%d\n",ans);
return ;
}
随机推荐
- linux下重启oracle数据库
如何在linux下重启oracle数据库 | 浏览:3930 | 更新:2013-09-18 19:33 1 2 3 4 5 6 分步阅读 在实际工作项目中,有时候会遇到需要对oracle数据库进行重 ...
- 数据库设计mysql字段不默认为NULL原因搜集
索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的.所以我们在数据库设计时不要让字段的默认值为NULL ...
- 不插字段,直接利用OracleSpatial计算
select to_char(regexp_replace(sdo_util.to_gmlgeometry(sdo_geom.sdo_difference( SDO_GEOMETRY ( 2003, ...
- react框架下,在页面内加载显示PDF文件,关于react-pdf-js的使用注意事项
react框架下,在页面内加载显示PDF文件,关于react-pdf-js的使用注意事项 之前做了一个需求,在注册账号的时候,让用户同意服务条款, 服务条款是一个PDF文件, 这就需要在react内加 ...
- 一个简单的hexo搭建博客网站的故事
首先安装hexo mkdir hexo #创建一个文件夹 cd hexo #切换到hexo目录下面 npm install -g hexo-cli npm install hexo --save 然后 ...
- 洛谷P1310 表达式的值 题解 栈/后缀表达式的应用
题目链接:https://www.luogu.org/problem/P1310 本题涉及算法:栈.前缀表达式转后缀表达式,动态规划思想. 这道题目我思考了好长时间,第一时间让我做的话我也做不出来. ...
- H3C ACL包过滤的局限性
- python编程之操作系统基础
操作系统发展史: 最早的计算机没有操作系统的概念:是使用打孔机和打孔卡片来进行计算的.只能一个一个处理. 后来产生了批处理系统,可以批量处理,进而加快计算的速度. 批处理系统:串行 数据处理速度加快 ...
- 后缀数组 + LCP加速多模式匹配算法 O(m+logn)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- $_GET $_POST $_REQUEST
<form action="__APP__/View/editArticle?id=5" method="GET"> <form>表单提 ...