题解 | #小苯的蓄水池(并查集)#

小苯的蓄水池(hard)

https://ac.nowcoder.com/acm/contest/93847/E

#include <bits/stdc++.h>
using namespace std;

const int N  = 2e5+10;
int n,m;
int f[N];
double x;
struct node{
    double sum;
    int cnt;
    int l,r;
}a[N];

int find(int x){
    return f[x] == x ? x : f[x] = find(f[x]);
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i = 1;i<=n;i++){
        scanf("%lf",&a[i].sum);
        a[i].cnt = 1;
        f[i] = i;
        a[i].l = a[i].r = i;
    }
    
    while(m--){
        int op,x,y;
        scanf("%d",&op);
        if(op==1){
            scanf("%d%d",&x,&y);
            for(int i = a[f[x]].r+1;i<=a[f[y]].l;i++){
                if(find(i)==find(x)) continue;
                f[find(i)] = find(x);
                a[f[x]].sum += a[i].sum;
                a[f[x]].cnt += a[i].cnt;
                a[f[x]].r = max(a[f[x]].r,a[f[i]].r);
                a[f[x]].l = min(a[f[x]].l,a[f[i]].l);
            }
        }
        else{
            scanf("%d",&x);
            printf("%.10lf\n",a[find(f[x])].sum/a[find(f[x])].cnt);
        }
    }
    
    return 0;
}
全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
如题如果提出了一个薪资,A不成功,会有可能被取消offer吗
爱打瞌睡的柯基:最想去你们公司 但是别家开的高一些,希望能申请高一点 不管结果如何都谢谢你
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务