1114 Family Property - PAT (Advanced Level) Practice (pintia.cn)
#include "bits/stdc++.h"
using namespace std;
/*
* 一直出错的原因
* id为4位数,我忽略了0000
*/
struct Node{
int sets;
int area;
int id;
}inf[1010];
struct Ans{
int id;
int cnt;
double sets;
double area;
void out(){
cout<<setw(4)<<setfill('0')<<id<<" ";
cout<<cnt<<" ";
cout << fixed << setprecision(3)<<sets<< " ";
cout<<fixed <<setprecision(3)<<area<<"\n";
}
};
int p[10010];
bool st[10010];
int find(int x){
if(p[x] != x)p[x]=find(p[x]);
return p[x];
}
void merge(int x,int y)
{
int a= find(x),b= find(y);
if(a!=b){
a<b?p[b]=a:p[a]=b;
}
}
int main()
{
for(int i=0;i<10000;i++)p[i]=i;
int n;
cin>>n;
for(int i=0;i<n;i++){
int k;
int idx,fax,mox,chx;
cin>>idx>>fax>>mox;
inf[i].id=idx;
st[idx]=true;
if(mox!=-1){
merge(mox,idx);
st[mox]=true;
}
if(fax!=-1) {
merge(fax,idx);
st[fax]=true;
}
cin>>k;
while(k--){
cin>>chx;
st[chx]=true;
merge(idx,chx);
}
cin>>inf[i].sets>>inf[i].area;
}
map<int,Ans> mp;
for(int i=0;i<n;i++){
int t=find(inf[i].id);
mp[t].sets += inf[i].sets;
mp[t].area += inf[i].area;
}
for(int i=0;i<10000;i++){
if(st[i]){
int t=find(i);
mp[t].cnt++;
}
}
vector<Ans> ans;
for(auto [a,b]:mp){
b.id=a;
b.sets/=b.cnt;
b.area/=b.cnt;
ans.push_back(b);
}
sort(ans.begin(),ans.end(),[](const Ans& a,const Ans& b){
if(a.area != b.area)return a.area> b.area;
return a.id<b.id;
});
cout<<ans.size()<<"\n";
for(int i=0;i<ans.size();i++){
ans[i].out();
}
}