题意:

输入一个正整数N(<=10000),接着输入N行每行包括一个人的ID和他双亲的ID以及他的孩子数量和孩子们的ID(四位整数包含前导零),还有他所拥有的房产数量和房产面积。输出一共有多少个块(所有有父子关系的点都视为处于同一块),以及每块的元素个数以及平均每人分得的房产数量和房产面积(保留三位小数),输出顺序按照房产面积降序,第二优先以ID升序。

AAAAAccepted code:

 #define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
int ba[];
int per[];
int sets[],area[];
int num[];
int child[];
int find_(int x){
if(ba[x]==x)
return x; return ba[x]=find_(ba[x]);
};
typedef struct{
int id,num;
double avgsets,avgarea;
}st;
st ans[];
int vis[];
int flag[];
bool cmp(st a,st b){
if(a.avgarea!=b.avgarea)
return a.avgarea>b.avgarea;
return a.id<b.id;
}
int main(){
//ios::sync_with_stdio(false);
//cin.tie(NULL);
//cout.tie(NULL);
for(int i=;i<;++i)
ba[i]=i,num[i]=;
int n;
scanf("%d",&n);
for(int i=;i<=n;++i){
memset(flag,,sizeof(flag));
int id;
scanf("%d",&id);
int x=,y=,z=;
x=find_(id);
int fa,mo;
scanf("%d%d",&fa,&mo);
if(fa!=-)
y=find_(fa);
if(mo!=-)
z=find_(mo);
int root=min(x,y);
root=min(root,z);
int k;
scanf("%d",&k);
int mn=;
for(int j=;j<=k;++j){
scanf("%d",&child[j]);
mn=min(mn,find_(child[j]));
vis[child[j]]=;
}
int tsets,tarea;
scanf("%d%d",&tsets,&tarea);
sets[x]+=tsets;
area[x]+=tarea;
if(mn<root)
root=mn;
if(x!=root)
flag[x]=,num[root]+=num[x],sets[root]+=sets[x],area[root]+=area[x];
if(y!=root&&y!=&&!flag[y])
flag[y]=,num[root]+=num[y],sets[root]+=sets[y],area[root]+=area[y];
if(z!=root&&z!=&&!flag[z])
flag[z]=,num[root]+=num[z],sets[root]+=sets[z],area[root]+=area[z];
ba[x]=root;
if(y<)
ba[y]=root;
if(z<)
ba[z]=root;
for(int j=;j<=k;++j){
int temp=find_(child[j]);
ba[temp]=root;
if(temp!=root&&!flag[temp]){
flag[temp]=;
num[root]+=num[temp];
sets[root]+=sets[temp];
area[root]+=area[temp];
}
}
vis[id]=;
if(fa!=-)
vis[fa]=;
if(mo!=-)
vis[mo]=;
}
int cnt=;
for(int i=;i<;++i){
if(ba[i]==i&&vis[i]){
ans[++cnt].id=i;
ans[cnt].num=num[i];
ans[cnt].avgsets=1.0*sets[i]/num[i];
ans[cnt].avgarea=1.0*area[i]/num[i];
}
}
sort(ans+,ans++cnt,cmp);
printf("%d\n",cnt);
for(int i=;i<=cnt;++i){
printf("%04d %d %.3lf %.3lf",ans[i].id,ans[i].num,ans[i].avgsets,ans[i].avgarea);
if(i<cnt)
printf("\n");
}
return ;
}

【PAT甲级】1114 Family Property (25分)(并查集)的更多相关文章

  1. PAT甲题题解-1114. Family Property (25)-(并查集模板题)

    题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房 ...

  2. PAT甲级1114. Family Property

    PAT甲级1114. Family Property 题意: 这一次,你应该帮我们收集家族财产的数据.鉴于每个人的家庭成员和他/她自己的名字的房地产(房产)信息,我们需要知道每个家庭的规模,以及他们的 ...

  3. PAT甲级——1114 Family Property (并查集)

    此文章同步发布在我的CSDN上https://blog.csdn.net/weixin_44385565/article/details/89930332 1114 Family Property ( ...

  4. PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习

    1020 Tree Traversals (25分)   Suppose that all the keys in a binary tree are distinct positive intege ...

  5. PAT 甲级 1146 Topological Order (25 分)(拓扑较简单,保存入度数和出度的节点即可)

    1146 Topological Order (25 分)   This is a problem given in the Graduate Entrance Exam in 2018: Which ...

  6. PAT 甲级 1071 Speech Patterns (25 分)(map)

    1071 Speech Patterns (25 分)   People often have a preference among synonyms of the same word. For ex ...

  7. PAT 甲级 1063 Set Similarity (25 分) (新学,set的使用,printf 输出%,要%%)

    1063 Set Similarity (25 分)   Given two sets of integers, the similarity of the sets is defined to be ...

  8. PAT 甲级 1059 Prime Factors (25 分) ((新学)快速质因数分解,注意1=1)

    1059 Prime Factors (25 分)   Given any positive integer N, you are supposed to find all of its prime ...

  9. PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)

    1051 Pop Sequence (25 分)   Given a stack which can keep M numbers at most. Push N numbers in the ord ...

  10. PAT 甲级 1048 Find Coins (25 分)(较简单,开个数组记录一下即可)

    1048 Find Coins (25 分)   Eva loves to collect coins from all over the universe, including some other ...

随机推荐

  1. openlayers显示区域

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. elasticsearch index 过程

    (1)index request 到某一个Node(选择node的方式是采用round-robin)方法,此node 称为coordinate node,继续当前index request应该执行在哪 ...

  3. 在mac下初次使用pygame踩坑纪实(卡死)

    初次使用pygame实现绘图功能就踩坑 直接上代码 import pygame pygame.init() # 创建游戏的窗口 480 * 700screen = pygame.display.set ...

  4. python3爬取淘宝商品(失效)

    最近有人反映淘宝的搜索功能要登录才能用,原先的直接爬取的方法挂了.稍微把之前的代码修改了一下,登录采用最简单的复制cookie来解决. 顺便说一下,这只是根据搜索的的索引界面获取的信息,并未深入的获取 ...

  5. 求a^b的约数对mod取模

    +; int prime[maxn]; void marktable(int n){ memset(prime,,sizeof(prime)); ;i<=n;i++){ ]]=i; ;j< ...

  6. 532-数组中的K-diff数对

    532-数组中的K-diff数对 给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对.这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组 ...

  7. mysql 服务

    1.以管理员身份运行cmd:C:\Windows\System32\cmd.exe  右键以管理员身份运行 2.“具体路径” --install   “D:\programme installatio ...

  8. 模拟退火SA刷题记录

    洛谷P1337 [JSOI2004]平衡点 / 吊打XXX 基本上是照着别人的代码写的,模拟退火为什么一定能找到答案呢...迷惑,,有时间搜一搜证明啥的 sa步骤:这个是要确定一个(xi,yi)使得函 ...

  9. C语言 goto

    C语言 goto 功能:无条件跳转.不推荐使用 案例 #include <stdio.h> int main() { // 函数跳转.循环跳转 // 创建标志位开始 // 无条件跳转到En ...

  10. [SDOI2013] 直径 - 树形dp

    对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. Solution 有点意思 先随便求一条直径(两次DFS即可),不妨设为 \(s,t\),我们知道要求的这些边一定都在这 ...