Love Live!-01字典树启发式合并

本文介绍了一种结合并查集和01字典树的数据结构算法,用于解决在带权图中寻找每个等级下最大简单路径中的最大异或值问题。通过启发式合并策略,确保每次添加新边时更新最大异或路径,最终实现高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链接:https://ac.nowcoder.com/acm/contest/201/D?&headNav=www

思路:题目要求的是每个等级下的最大 简单路径中的最大异或值,那么我们为了保证目前的路径中最大的权值

为当前访问的边,先进行排序,然后一条一条的插入边,并查集维护  各个联通块,启发式合并,由当前边连接起来的

两个联通块,所谓启发式合并也就是 把小的块 合并到大的上。然后 查询的时候就是再当前 这条边的两个联通块中

找一个包含此边的 最大异或路径,  为了方便处理 我们可以把每个点 存储一个到 它并查集根节点的 异或值,

这样进行 0 1 字典树维护即可。

#include<bits/stdc++.h>
using namespace std;
#define maxn 234567
vector<int>gra[maxn];
int tree[maxn*100][3],ans[maxn];
int n,m,u,v,w,root[maxn],tx,ty;
int fa[maxn],val[maxn],tot,sz[maxn];
struct node
{
    int x,y,w;
    bool operator<(const node &b)const
    {
        return w<b.w;
    }
} edge[maxn];
int fond(int x)
{
    return x==fa[x]?x:fa[x]=fond(fa[x]);
}
void updata(int x,int ad)
{
    for(int i=20; i>=0; i--)
    {
        int id=((1<<i)&ad)?1:0;
        if(!tree[x][id])
            tree[x][id]=++tot;
        x=tree[x][id];
    }
}
int query(int x,int ad)
{
    int ret=0;
    for(int i=20; i>=0; i--)
    {
        int id=((1<<i)&ad)?1:0;
        if(tree[x][id^1])
        {
            x=tree[x][id^1];
            ret|=(1<<i);
        }
        else x=tree[x][id];
    }
    return ret;
}
int main()
{
    scanf("%d",&n);
    for(int i=1; i<n; i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        edge[i]=(node{u,v,w});
    }
    sort(edge+1,edge+n);
    for(int i=1; i<=n; i++)
    {
        fa[i]=i;
        sz[i]=1;
        gra[i].push_back(i);
        root[i]=++tot;
        updata(root[i],0);
    }
    for(int i=1; i<n; i++)
    {
        u=edge[i].x,tx=fond(u);
        v=edge[i].y,ty=fond(v);
        w=(edge[i].w^val[u]^val[v]);
        if(sz[tx]>sz[ty])swap(tx,ty),swap(u,v);
        for(int j=0; j<sz[tx]; j++)
            ans[i]=max(ans[i],query(root[ty],(w^val[gra[tx][j]])));
        for(int j=0; j<sz[tx]; j++)
        {
            val[gra[tx][j]]^=w;
            gra[ty].push_back(gra[tx][j]);
            updata(root[ty],val[gra[tx][j]]);
        }
        fa[tx]=ty;
        sz[ty]+=sz[tx];
    }
    for(int i=1; i<n; i++)
    {
        printf("%d",ans[i]);
        if(i!=n-1)printf(" ");
        else printf("\n");
    }
    return 0;
}

  

转载于:https://www.cnblogs.com/SDUTNING/p/10302518.html

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值