PAT (Advanced Level) Practice - 1114 Family Property(25 分)

题目链接:点击打开链接

 

题目大意:略。

 

解题思路:并查集 + STL 大杂烩。注意:并查集中,不能参与统计操作,因为会出现中途连接之前断开的结点,这样之前的计算就会有误差。

 

AC 代码

#include
#include

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

const int maxn=1e4+10;

int pre[maxn], area[maxn], cnt[maxn];
set hst, st[maxn];
set::iterator sit;
unordered_map ump;
unordered_map::iterator it;

struct peo
{
    int id, num;
    double cnt, area;
}ps[maxn];

void init()
{
    for(int i=0;ip2.area;
}

int main()
{
    init();
    int n,id,pid1,pid2,k,tid,a,b,oid;
    scanf("%d",&n);
    // 只处理并查集操作,+-操作不能放在这区域,因为可能会出现两个一开始毫无关联,但中途把之前两个关联起来,这样就会有误算
    for(int i=0;ifirst);
        st[id].insert(it->first); // 利用 key 自动排序,筛选编号最小
        hst.insert(id); // 收集每个家庭的祖先结点
        if(id!=it->first)
            cnt[id]+=cnt[it->first],
            area[id]+=area[it->first];
    }

    int l=0;
    for(sit=hst.begin();sit!=hst.end();sit++)
    {
        ps[l].id=*(st[*sit].begin());
        ps[l].num=st[*sit].size();
        ps[l].cnt=cnt[*sit]*1.0/ps[l].num;
        ps[l].area=area[*sit]*1.0/ps[l].num;
        l++;
    }

    sort(ps,ps+l,cmp);
    printf("%d\n",l);
    for(int i=0;i

 

你可能感兴趣的:(#,ACM,#,PTA,#,STL,#,并查集,PAT,(Advanced,Level),Practice,1114,Family,Property(25,分),团体程序设计天梯赛-练习集,L2-007,家庭房产(25,分),并查集,并查集)