#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int fa[10000]={0},exist[10000]={0};
int bookminroot[10000]={0};
int bookk[10000]={0};
int booknum[10000]={0};
double bookvs[10000],bookva[10000];
struct condi{
double mnum,area;
};
vector<condi>v(10000);
struct node{
int id,mm;
double avs,ava;
};
vector<node> ans;//因为最后要排序所以尽量不要有其他多余的信息。
bool cmp(node&a,node&b){
if(a.ava!=b.ava) return a.ava>b.ava;
else return a.id<b.id;
}
int findfa(int x){
int a=x;
while(x!=fa[x]){
x=fa[x];
}
while(a!=fa[a]){
int z=a;
a=fa[a];
fa[z]=x;
}
return x;
}
void unionn(int a,int b){
int a1=findfa(a);
int a2=findfa(b);
if(a1!=a2){
fa[a1]=a2;
}
}
int main(){
int n,_1,_2,_3,k,_5;
//初始化并查集
for(int i=0;i<10000;i++){
fa[i]=i;
}
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&_1,&_2,&_3,&k);
exist[_1]=1;
exist[_2]=1;
exist[_3]=1;
if(_2!=-1)
unionn(_1,_2);
if(_3!=-1)
unionn(_1,_3);
for(int j=0;j<k;j++){
scanf("%d",&_5);
exist[_5]=1;
unionn(_1,_5);
}
scanf("%lf %lf",&v[_1].mnum,&v[_1].area);
}
//最小根
int temp;
for(int i=0;i<10000;i++){
temp=findfa(i);
if(exist[i]==1&&bookminroot[temp]==0){
bookminroot[temp]=1;
bookk[temp]=i;//将根与最小根联系
}
}
//成员数
int numm,temp1;
for(int i=0;i<10000;i++){
if(exist[i]==1){
temp1=findfa(i);
booknum[temp1]++;
}
}
//vs va
int temp2;
for(int i=0;i<10000;i++){
if(exist[i]==1){
temp2=findfa(i);
bookvs[temp2]+=v[i].mnum;
bookva[temp2]+=v[i].area;
}
}
for(int i=0;i<10000;i++){
if(bookminroot[i]==1){
int faa=findfa(i);
int idd=bookk[i];
int mmm=booknum[faa];
double avss=1.0*bookvs[faa]/mmm;
double avaa=1.0*bookva[faa]/mmm;
ans.push_back(node{idd,mmm,avss,avaa});
}
}
sort(ans.begin(),ans.end(),cmp);
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++){
printf("%04d %d %.3lf %.3lf\n",ans[i].id,ans[i].mm,ans[i].avs,ans[i].ava);
}
return 0;
}
总结
1.当本地运行出来的结果与平台上的不同时,考虑编译器选择个其他的,以前都是g++,不行,改成clang就通过了
2.存答案的vector,如果最后需要sort就不要指定大小了,尽量少一些多余信息
3.当出现像统计一个set里某个东西的总数时,找到根建立book加等到根上就可以啦,注意类型
4.不要着急,越着急越容易出错
5.并查集并的操作只会在还没有在一个集合里时执行,即不用担心重复输入时会多并,不会
6.本题一个特点是要记录set中最小的id 直接从小到大第一个找到的就是 将逻辑简化 找到后让后面同根的进不来就可以了
加油 棒棒哒
英语
无
问题