从叶子结点向根节点遍历:最后一个测试点超时
最后一个测试点超时原因
# include <bits/stdc++.h>
using namespace std;
int Root;
int N;
double P, r;
vector<int> leafLevel;
vector<int> father;
vector<bool> isFather;
int main(){
cin >> N >> P >> r;
father.resize(N);
isFather.resize(N);
leafLevel.resize(N);
for(int i = 0;i < N;++i){
int t;
scanf("%d", &t);
if(t == -1) Root = i;
else{
isFather[t] = true;
}
father[i] = t;
}
int maxlevel = 0;
int maxnum = 0;
for(int i = 0;i < N;++i){
if(isFather[i] == false){
for(int t = father[i];t != -1;t = father[t]){
leafLevel[i]++;
}
if(leafLevel[i] > maxlevel){
maxnum = 1;
maxlevel = leafLevel[i];
} else
if(leafLevel[i] == maxlevel){
maxnum++;
}
}
}
printf("%.2lf %d\n", P * pow((1+0.01*r), maxlevel), maxnum);
return 0;
}
使用DFS从根到叶子结点,AC
# include <bits/stdc++.h>
using namespace std;
int Root, N;
double P, r;
vector<int> G[100010];
int maxlevel = 0, maxnum = 0;
void DFS(int u, int level){
if(G[u].size() == 0){
if(level > maxlevel){
maxlevel = level;
maxnum = 1;
} else
if(level == maxlevel){
maxnum++;
}
return;
}
for(int v: G[u])
DFS(v, level+1);
}
int main(){
cin >> N >> P >> r;
for(int i = 0;i < N;++i){
int t;
scanf("%d", &t);
if(t == -1) Root = i;
else
G[t].push_back(i);
}
DFS(Root, 0);
printf("%.2lf %d\n", P * pow((1+0.01*r), maxlevel), maxnum);
return 0;
}