本人思路是建图求最长链,然后输出其长度和本身所储存的数,但问题是,咋输出呢?
#include<bits/stdc++.h>
using namespace std;
long long a[100005],b[10005];
int n,as;
struct node{
int next,to;
};
int vis[100005],flag[100005];
vector<int> v[100005],v2[100005];
int dfs(int x){
if(vis[x]) return vis[x];
for(int i=0;i<v[x].size();i++){
vis[x]=max(vis[x],dfs(v[x][i]));
}
vis[x]++;
return vis[x];
}
int main(){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++){
if(a[i]%3==0){
int j=lower_bound(a,a+n,a[i]/3)-a;
if(a[j]*3==a[i]){
v[i].push_back(j);
v2[j].push_back(i);
}
}
int j0=lower_bound(a,a+n,a[i]*2)-a;
if(a[j0]==a[i]*2){
v[i].push_back(j0);
v2[j0].push_back(i);//一开始打算建反图输出,然后就不会了
}
}
// for(int i=0;i<n;i++){
// for(int j=0;j<v2[i].size();j++)
// cout<<a[i]<<"-->"<<a[v2[i][j]]<<" ";
// cout<<endl;
// }
for(int i=0;i<n;i++) as=max(as,dfs(i));
cout<<as<<endl;
cout<<flag[as];
}