做不动LCT,就来敲个模拟题解解气吧
dfs 存个结构体维护信息 排个序 然后没了
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e4+10, M = 1e6+10;
int n, cnt;
int h[N], tot;
struct {int to,nxt;}e[M];
int houses[N], area[N],vis[N];
vector<int> ids;
struct Node
{
int id = 1e5, num;
int h, a;
}res[N];
bool cmp(const Node &a, const Node &b)
{
if(a.a * b.num != b.a * a.num) return a.a * b.num > b.a * a.num;
return a.id < b.id;
}
void add(int a,int b)
{
e[tot].to = b, e[tot].nxt = h[a], h[a] = tot ++;
}
void dfs(int u)
{
vis[u] = 1;
res[cnt].id = min(res[cnt].id, u);
res[cnt].num ++;
res[cnt].h += houses[u], res[cnt].a += area[u];
for(int i = h[u]; ~i; i = e[i].nxt)
{
int to = e[i].to;
if(!vis[to]) dfs(to);
}
}
int main()
{
memset(h, -1, sizeof h);
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
int id, fa, ma, k;
scanf("%d%d%d%d", &id, &fa, &ma, &k);
ids.push_back(id);
if(fa != -1) add(fa, id), add(id, fa), ids.push_back(fa);
if(ma != -1) add(ma, id), add(id, ma), ids.push_back(ma);
while(k --)
{
int ch; scanf("%d", &ch);
add(id, ch); add(ch, id); ids.push_back(ch);
}
scanf("%d%d", &houses[id], &area[id]);
}
for(int i = 0; i < ids.size(); ++i) if(!vis[ids[i]]) dfs(ids[i]), cnt ++;
cout << cnt << '\n';
sort(res, res + cnt, cmp);
for(int i = 0; i < cnt; ++i)
printf("%04d %d %.3lf %.3lf\n", res[i].id, res[i].num,
(double)res[i].h / res[i].num, (double)res[i].a / res[i].num);
}