一开始,我是想直接建树的。用传统的“玲姐表”建树方法,因为N*N=1e10了,邻接矩阵是超内存了。然后数据又是稀疏的,所以邻接表可以完成。
可是后来发现了数据的特殊性,数据给出了子节点的编号,数据层数就是子节点的编号。那么只需要根据数据节点的层数做一个bfs就可以了。
queue做bfs
id【0】里存着该层的徒弟的数量。
g存着门派的功力
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int const N=1e5+10;
int n;
double g[N],z,r;
int main(){
cin>>n>>z>>r;
vector<vector<int> > id;
for(int i=0;i<n;i++){
int k;
cin>>k;
vector<int> v;
v.push_back(k);
if(k==0){
int t;
cin>>t;
v.push_back(t);
}
else {
for(int j=1;j<=k;j++){
int t;
cin>>t;
v.push_back(t);
}
}
id.push_back(v);
}
queue<int> q;
q.push(0);
g[0]=z;
double s=0;
while(q.size()){
int t=q.front();
q.pop();
if(id[t][0]==0){
g[t]*=id[t][1];//放大功力
s+=g[t];//视为修行者
}
for(int i=1;i<=id[t][0];i++){//遍历徒弟
int j=id[t][i];
q.push(j);
g[j]=g[t]-g[t]*r/100;//功力衰减
}
}
cout<<(int)s<<endl;
}