思路:
这题明显是并查集,最后一个测试点超时,但是只有三分,没去专研了,其实可以改进的,可以存储每一层的功力值,就不必每次去运算了,只需要算一次
直接上代码
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int p[100005];
int main(){
int n;
double z,r,sum = 0;
scanf("%d %lf %lf",&n,&z,&r);
for(int i=0; i<n; i++){
p[i] = i;
}
for(int i=0; i<n; i++){
int k;
scanf("%d",&k);
int temp;
if(k==0){
scanf("%d",&temp);
int c = i;
double zz = z;
while(p[c]!=c){
c = p[c];
zz *= (100.0-r)/100.0;
}
zz *= temp;
sum += zz;
continue;
}
for(int j=0; j<k; j++){
scanf("%d",&temp);
p[temp] = i;
}
}
printf("%d",(int)sum);
return 0;
}