这两天要是debug不出来就重写(笑
感觉用并查集然后合并的时候维护会好写一点,代码80行左右可以参考下思路
挖坑,监督自己填上
upd : 已A : (重写yyds
#include <bits/stdc++.h>
using namespace std;
const int N = 10010;
int pa[N], peo[N], mn[N];
double house[N], area[N];
int Find(int x) {
return pa[x] == x ? x : pa[x] = Find(pa[x]);
}
struct node {
int mn, peo;
double house, area;
bool operator< (const node& obj) const {
if(fabs(area / (double)peo - obj.area / (double)obj.peo) < 1e-8) return mn < obj.mn;
return area / (double)peo > obj.area / (double)obj.peo;
}
};
vector<node> ans;
set<int> st;
void Union(int x, int y) {
int pax = Find(x), pay = Find(y);
if(pax == pay) return;
mn[pay] = min(mn[pay], mn[pax]);
house[pay] += house[pax];
peo[pay] += peo[pax];
area[pay] += area[pax];
pa[pax] = pay;
return;
}
int main() {
for(int i = 0; i < 10000; ++ i) {
pa[i] = i; peo[i] = 1; mn[i] = i;
}
int n;
cin >> n;
double num, are;
for(int i = 1, idx, fa, ma, k; i<= n; ++ i) {
cin >> idx >> fa >> ma;
st.insert(idx);
if(fa != -1) {
Union(idx, fa);
st.insert(fa);
}
if(ma != -1) {
Union(idx, ma);
st.insert(ma);
}
cin >> k;
for(int j = 0, x; j < k; ++ j) {
cin >> x;
Union(idx, x);
st.insert(x);
}
cin >> num >> are;
int pp = Find(idx);
house[pp] += num;
area[pp] += are;
}
for(int i = 0; i < 10000; ++ i) {
if(pa[i] == i && st.count(i)) {
ans.push_back({
mn[i], peo[i], house[i], area[i]});
}
}
sort(ans.begin(), ans.end());
int siz = ans.size();
cout << siz << endl;
for(int i = 0; i < siz; ++ i) {
printf("%04d %d %.3f %.3f\n", ans[i].mn, ans[i].peo,
ans[i].house / (double)ans[i].peo, ans[i].area / (double)ans[i].peo);
}
}