转自点击打开链接

之前写的时候在while后面多加了个;一直超时,心态爆炸;;;;;;;;;;;

#include<cstdio>
#include<algorithm>
using namespace std;
struct DATA{
   int id,fid,mid,num,area;
   int cid[10];
   }data[1005];
struct node{
   int id,people;
   double num,area;
   bool flag=false;
   }ans[10000];
int father[10000];
bool visit[10000];
int findf(int x){
   while(x!=father[x])
      x=father[x];
   return x;
}
void Union(int a,int b){
   int faA=findf(a);
   int faB=findf(b);
   if(faA>faB)
      father[faA]=faB;
   else if(faA<faB)
       father[faB]=faA;
}
int cmp1(node a,node b){
   if(a.area!=b.area)
      return a.area>b.area;
   else
    return a.id<b.id;
}
int main()
{
    int n,k,cnt=0;
    scanf("%d",&n);
    for(int i=0;i<10000;i++)
        father[i]=i;
   for(int i = 0; i < n; i++) {
        scanf("%d %d %d %d", &data[i].id, &data[i].fid, &data[i].mid, &k);
        visit[data[i].id] = true; //标记
        if(data[i].fid != -1) {  //有父亲
            visit[data[i].fid] = true;
            Union(data[i].fid, data[i].id);
        }
        if(data[i].mid != -1) {  //有母亲
            visit[data[i].mid] = true;
            Union(data[i].mid, data[i].id);
        }
        for(int j = 0; j < k; j++) {  //孩子
            scanf("%d", &data[i].cid[j]);
            visit[data[i].cid[j]] = true;
            Union(data[i].cid[j], data[i].id);
        }
        scanf("%d %d", &data[i].num, &data[i].area);  //房子
    }
    for(int i = 0; i < n; i++) {
        int id = findf(data[i].id);
        ans[id].id = id;
        ans[id].num += data[i].num;
        ans[id].area += data[i].area;
        ans[id].flag = true;   //家族
    }
    for(int i = 0; i < 10000; i++) {
        if(visit[i])
            ans[findf(i)].people++;  //统计人数
        if(ans[i].flag)
            cnt++;    //统计家族个数
    }
    for(int i = 0; i < 10000; i++) {
        if(ans[i].flag) {
            ans[i].num = (double)(ans[i].num * 1.0 / ans[i].people);
            ans[i].area = (double)(ans[i].area * 1.0 / ans[i].people);
        }
    }
    sort(ans, ans + 10000, cmp1);
    printf("%d\n", cnt);
    for(int i = 0; i < cnt; i++)
        printf("%04d %d %.3f %.3f\n", ans[i].id, ans[i].people, ans[i].num, ans[i].area);
    return 0;
}