#include<stdio.h>
#include<stdlib.h>
typedef struct node{
//自己父母和孩子的编号
int master;
int fa;
int mu;
int kidn;
int kids[10];
double sum,area;
}node;
node a[10005];//输入行的结构体
typedef struct node1{
int people;
int id,flag;
double sum,area;
}node1;
node1 b[10005];//家庭的结构体
typedef struct node2{
int people;
int id;
double sum,area;
}node2;
node2 c[1005];
int n;
int cnt=0;
int visit[10005]={0};
int home[10005];
int find(int x);
void un(int a,int b);
int main()
{
for(int i=0;i<10005;i++){ //初始化
home[i]=i;
b[i].flag=0; //该题所需,并非并查集的要求
}
//输入数据
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d %d %d %d",&a[i].master,&a[i].fa,&a[i].mu,&a[i].kidn);
visit[a[i].master]=1;
//判断是否有人去世
if(a[i].fa!=-1){
un(a[i].master,a[i].fa);
visit[a[i].fa]=1;
}
if(a[i].mu!=-1){
un(a[i].master,a[i].mu);
visit[a[i].mu]=1;
}
for(int j=0;j<a[i].kidn;j++){
scanf("%d",&a[i].kids[j]);
un(a[i].master,a[i].kids[j]);
visit[a[i].kids[j]]=1;
}
scanf("%lf %lf",&a[i].sum,&a[i].area);
}
//判断是否有人同时出现在几个输入行中
for(int i=0;i<n;i++){
//求房产总数和面积总数
int id=find(a[i].master);
b[id].id=id;
b[id].sum+=a[i].sum;
b[id].area+=a[i].area;
b[id].flag=1;
}
for(int i=0;i<10005;i++){
if(visit!=0){
b[find(i)].people+=1;
}
}
//求人均房产套数,面积
for(int i=0;i<10005;i++){
if(b[i].flag){
b[i].sum=b[i].sum/b[i].people;
b[i].area=b[i].area/b[i].people;
}
}
for(int i=0;i<10005;i++){
if(b[i].flag){
c[cnt].id=b[i].id;
c[cnt].area=b[i].area;
c[cnt].people=b[i].people;
c[cnt].sum=b[i].sum;
cnt++;
}
}
node2 t;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(c[i].area<c[j].area){
t=c[i];
c[i]=c[j];
c[j]=t;
}else{
if(c[i].area==c[j].area){
if(c[j].id<c[i].id){
t=c[i];
c[i]=c[j];
c[j]=t;
}
}
}
}
}
printf("%d\n",cnt);
for(int i=0;i<cnt;i++){
printf("%04d %d %.3lf %.3lf\n",c[i].id,c[i].people,c[i].sum,c[i].area);
}
return 0;
}
int find(int x){
while(x!=home[x]){
x=home[x];
}
return x;
}
void un(int a,int b){
int f11=find(a);
int f22=find(b);
if(f11>f22){
home[f11]=f22;
}else{
home[f22]=f11;
}
}
#include<iostream>
#include<queue>
using namespace std;
const int maxn=35;
int post[maxn],mid[maxn],pos[maxn],n,p;
struct N{int data;N *l,*r;};
//对二叉树进行遍历
void creat(int l,int r,N* &fa){
for(int i=l;i<=r;i++) if(mid[i]==post[p]){fa=new N{post[p--]};break;}
if(fa) creat(pos[fa->data]+1,r,fa->r),creat(l,pos[fa->data]-1,fa->l);
}
int main(){
cin>>n,p=n;
//后序和中序遍历
for(int i=1;i<=n;i++) cin>>post[i];
for(int i=1;i<=n;i++) cin>>mid[i],pos[mid[i]]=i;
N *root;
creat(1,n,root);
queue<N> que; que.push(*root);
while(que.size()){
N t=que.front();que.pop();
if(t.l) que.push(*t.l),delete t.l;
if(t.r) que.push(*t.r),delete t.r;
//输出层序遍历的序列
cout<<t.data<<(que.size()?' ':'\n');
}
}