2021ICPC上海 H.Life is a Game (kruskal重构树倍增)

Posted quinn18

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021ICPC上海 H.Life is a Game (kruskal重构树倍增)相关的知识,希望对你有一定的参考价值。

文章目录


题目链接:LifeisaGame
n n n 个点, m m m 条边的无向连通图。
每个点上有个能力值,经过点时可以获得该能力值 a i ai ai,但每个点只能获得一次。
每条边上有个能力值限制 w i wi wi,只有当能力值超过 w i wi wi 时才能通过这条边。
Q Q Q 次询问,每次询问给出初始位置 x x x 和初始能力值 k k k,询问能获得的最大能力值是多少。
n , m , q < = 1 e 5 , a i < = 1 e 4 , w i < = 1 e 9 n,m,q<=1e5 , ai<=1e4 , wi<=1e9 n,m,q<=1e5,ai<=1e4,wi<=1e9

qwq铁了赛上读了今天才补题 之前其实听过重构树但是觉得啊不用学的啦
题解:
k r u s k a l kruskal kruskal重构树就是一颗二叉树 原先的点都是叶子节点
L C A ( u , v ) LCA(u,v) LCA(u,v)的权值是 原图 u u u v v v 路径上最大/小边权的最小/大值(由建树时边权的排序方式决定)
因为这个我们可以找存能量值为边集,然后用链上所需要的能量值max来判断能不能取得这个能量值
q1e5所以要一个 l o g log log 查询
因为是贪心的存一个虚拟的点再往上,所以只要能上去就能走到另一边

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int n, m, q;
int a[N];
int fa[N];
int f[N][31], cost[N][31];
struct node 
    int u, v, w;
e[N];
bool cmp(node a, node b) 
    return a.w<b.w;

int findf(int x) 
    if(fa[x]==x) return x;
    return fa[x]=findf(fa[x]);

int cnt;
void kruskal() 
    cnt=n;
    int tot=0;
    for(int i=1; i<=n+n; i++) fa[i]=i;
    for(int i=1; i<=m; i++) 
        int w=e[i].w;
        int u=findf(e[i].u);
        int v=findf(e[i].v);
        if(u!=v) 
            a[++cnt]=a[u]+a[v];
            fa[u]=fa[v]=f[u][0]=f[v][0]=cnt;
            cost[u][0]=w-a[u];
            cost[v][0]=w-a[v];
            ++tot;
        
        if(tot==n-1) break;
    

signed main() 
    cin>>n>>m>>q;
    for(int i=1; i<=n; i++) cin>>a[i];
    for(int i=1; i<=m; i++) cin>>e[i].u>>e[i].v>>e[i].w;
    sort(e+1, e+1+m, cmp);
    kruskal();
    a[0]=a[cnt];//没懂没写上gg
    int lg=log2(cnt)+1;
    for(int j=1; j<=lg; j++) 
        for(int i=1; i<=cnt; i++) 
            f[i][j]=f[f[i][j-1]][j-1];
            cost[i][j]=max(cost[i][j-1], cost[f[i][j-1]][j-1]);//两半的max
        
    
    while(q--) 
        int x, k;
        cin>>x>>k;
        for(int i=lg; i>=0; i--) if(cost[x][i]<=k) x=f[x][i];
		cout<<a[x]+k<<endl;
    
    return 0;


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

以上是关于2021ICPC上海 H.Life is a Game (kruskal重构树倍增)的主要内容,如果未能解决你的问题,请参考以下文章

2021 ICPC上海 H.Life is a Game(Kruskal重构树)

2021 ICPC上海 H.Life is a Game(Kruskal重构树)

2021 ICPC上海 H.Life is a Game(Kruskal重构树)

2021ICPC上海 H.Life is a Game (kruskal重构树倍增)

2021上海ICPC--H.Life is a Game--Kruskal重构树--铜牌拦路虎

2021 ICPC上海 I.Steadily Growing Steam(dp)