[CF1213G] Path Queries - Kruskal

Posted mollnn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF1213G] Path Queries - Kruskal相关的知识,希望对你有一定的参考价值。

给你一个有 (n) 个点的带权树,有 (m) 个查询,每次查询最大权值不大于 (x) 的点对的数目

Solution

模拟 Kruskal 的过程,并将整个过程的答案记录下来

询问 (x) 的时候,二分找到最后一个 (le x) 的位置,输出这个时刻的答案即可

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

#define int long long
const int N = 400005;

struct edge {
    int u,v,w;
    bool operator < (const edge &b) const {
        return w < b.w;
    }
} e[N];
int n,m,t1,t2,t3,ans,a[N],b[N],fa[N],sz[N];

int find(int p) {
    return fa[p]==p ? p : fa[p]=find(fa[p]);
}

void merge(int p,int q) {
    p=find(p); q=find(q);
    if(p-q) {
        fa[p]=q;
        ans+=sz[p]*sz[q];
        sz[q]+=sz[p];
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<n;i++) {
        cin>>t1>>t2>>t3;
        e[i]={t1,t2,t3};
    }
    sort(e+1,e+n);
    for(int i=1;i<=n;i++) {
        fa[i]=i;
        sz[i]=1;
    }
    for(int i=1;i<n;i++) {
        if(find(e[i].u)!=find(e[i].v)) {
            merge(e[i].u,e[i].v);
            a[i]=ans;
        }
        b[i]=e[i].w;
    }
    for(int i=1;i<=m;i++) {
        int x;
        cin>>x;
        cout<<a[upper_bound(b+1,b+n,x)-b-1]<<" ";
    }
}


以上是关于[CF1213G] Path Queries - Kruskal的主要内容,如果未能解决你的问题,请参考以下文章

codeforces1213G Path Queries 并查集

题解 CF938G Shortest Path Queries

CF 938G Shortest Path Queries

CF938G Shortest Path Queries (线段树分治)

CF1003D Coins and Queries 贪心

[CF817F]MEX Queries