Analysis : sort + union search, mainly because the data search is a bit more troublesome
#include <iostream>
#include<cstring>
#include<vector>
#include<map>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define MAX 999999999
int n,m;
struct Node{
int id,fa,mo;
int k;
vector<int>child;
int estate,area;
}node[10001];
struct Node2{
int id,num;
int as,aa;
}node2[10001];
int fa[10001];
int visi[10001];
int cmp(Node2 a,Node2 b)
{
if(1.0*a.aa/a.num != 1.0*b.aa/b.num) return 1.0*a.aa/a.num > 1.0*b.aa/b.num;
return a.id < b.id;
}
int findFa(int x)
{
if(x == fa[x]) return x;
return findFa(fa[x]);
}
void uni(int a,int b)
{
fa[findFa(a)] = findFa(b);
}
int main()
{
cin>>n;
for(int i = 0;i < 10001;i++)
fa[i] = i;
for(int i = 0 ; i < n ; i++)
{
int id,fa,mo,k;
cin>>id>>fa>>mo>>k;
node[id].fa = fa,node[id].mo = mo,node[id].id = id,node[id].k = k;
visi[id] = 1;
if(fa != -1){
uni(fa,id);
visi[fa] = 1;
}
if(mo != -1){
uni(mo,id);
visi[mo] = 1;
}
for(int j = 0 ; j < k ;j++)
{
int c;cin>>c;
node[id].child.push_back(c);
uni(c,id);
visi[c] = 1;
}
int es,ar;
cin>>es>>ar;
node[id].estate = es,node[id].area = ar;
}
int cnt = 0;
for(int i = 0 ; i < 10001;i++)
if(fa[i] == i && visi[i] == 1)
cnt++;
cout<<cnt<<endl;
int cnt2 = 0;
for(int i = 0 ; i < 10001;i++)
{
if(fa[i] == i && visi[i] == 1)
{
int f = 0;
for(int j = 0 ; j < 10001 ; j ++)
{
if(findFa(i) == findFa(j))
{
if(f == 0){
node2[cnt2].id = j;
f = 1;
}
node2[cnt2].num++;
node2[cnt2].as += node[j].estate;
node2[cnt2].aa += node[j].area;
}
}
cnt2++;
}
if(cnt2 == cnt)break;
}
sort(node2,node2+cnt,cmp);
for(int i = 0 ; i < cnt ; i++)
printf("%04d %d %.3f %.3f\n",node2[i].id,node2[i].num,1.0*node2[i].as / node2[i].num,1.0*node2[i].aa / node2[i].num);
return 0;
}