一、题目
二、输入输出
三、样例
输入
4 6
1 2 4 5
1 1 3
2 1
2 3
1 1 4
2 1
2 4
输出
2.3333333333
2.3333333333
3.0000000000
3.0000000000
四、题解
#include <iostream>
using namespace std;
const int N = 2010;
int n,m,x,op,l,r;
long long a[N],s[N],siz[N],p[202000]; //必须开long long 不然一个也过不了
int find(int i){
if(p[i]!=i){
p[i]=find(p[i]); //运用并查集来记录平均数
}
return p[i];
}
int main(void){
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
p[i]=i;
s[i]=a[i];
siz[i]=1;
}
while(m--){
cin>>op;
if(op==1){
cin>>l>>r;
int k1=find(l);
int k2=find(r);
while(k1!=k2){
s[k1]+=s[k2]; //不断更新祖先,得到平均数的总和
siz[k1]+=siz[k2]; //得到组成平均数的个数
p[k2]=k1; //更新对应的祖先
int r=k2-1; //不断遍历l-r上的所有数
k2=find(r);
}
}
else{
cin>>x;
x=find(x);
printf("%.10f\n",1.0*s[x]/siz[x]); //计算总和的平均数
}
}
}