dfs从根开始比从叶子结点开始快得多,
为了不超时->倒过来存
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
vector<int> T[100010];//T[supplier_index]=index
int highest_num=0,highest_depth=-1;
void dfs(int root,int depth){//还是从上往下
if(T[root].size()==0){
if(depth>highest_depth){
highest_depth=depth;
highest_num=1;
}else if(depth==highest_depth){
highest_num++;
}
}
for(int i=0;i<T[root].size();i++){
dfs(T[root][i],depth+1);
}
}
int main(){
int n,t,root;
double p,r;
scanf("%d %lf %lf",&n,&p,&r);
for(int i=0;i<n;i++){
scanf("%d",&t);
if(t==-1) root=i;
else T[t].push_back(i);//从下往上dfs,太多重复,容易超时,倒过来存不就行了~
}
dfs(root,0);
printf("%.2f %d",p*pow(1+0.01*r,highest_depth),highest_num);
return 0;
}