[模板]Link Cut Tree

本文深入探讨了Link Cut Tree算法的应用,特别是在处理动态连通性和权值修改问题上的高效表现。通过实例讲解了如何利用该算法进行路径查询、边的添加与删除、节点权值更新等操作,附带详细代码实现。

传送门

Description

给定n个点以及每个点的权值,要你处理接下来的m个操作。操作有4种。操作从0到3编号。点从1到n编号。

0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通的。

1:后接两个整数(x,y),代表连接x到y,若x到y已经联通则无需连接。

2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。

3:后接两个整数(x,y),代表将点x上的权值变成y。

Solution

\(Link\ Cut\ Tree\)模板题

\(findroot\)后要\(Splay\)到根?不然复杂度不保证???

在洛谷上实测\(535ms\),还算比较快吧

函数变量名奇异+神仙缩行\(\rightarrow\) 还是别看了


Code 

//2019.1.26 18:41-22:54
#include<bits/stdc++.h>
inline int read()
{
    register int x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
    return x*f;
}
class Link_Cut_Tree
{
    #define MN 300005 
    private:
        int N,fa[MN],c[MN][2],st[MN],val[MN],X[MN];
        bool rev[MN];
        inline bool nrt(int x){return c[fa[x]][0]==x||c[fa[x]][1]==x;}
        inline void Rev(int x){rev[x]^=1;std::swap(c[x][0],c[x][1]);}
        inline void up(int x){X[x]=X[c[x][0]]^X[c[x][1]]^val[x];}
        inline void down(int x){if(x&&rev[x])Rev(c[x][0]),Rev(c[x][1]),rev[x]=0;}
        #define get(x) (c[fa[x]][1]==x)
        inline void rotate(int x)
        {
            int y=fa[x],z=fa[y],l=get(x),r=l^1;if(nrt(y))c[z][get(y)]=x;fa[x]=z;
            c[y][l]=c[x][r];fa[c[x][r]]=y;c[x][r]=y;fa[y]=x;up(y);
        }
        inline void Splay(int x)
        {
            static int top,q[MN];q[top=1]=x;register int i;
            for(i=x;nrt(i);i=fa[i]) q[++top]=fa[i];for(;top;--top) down(q[top]);
            for(;nrt(x);rotate(x))if(nrt(fa[x])) rotate(get(fa[x])^get(x)?x:fa[x]);up(x);
        }
        #undef get
        inline void access(int x){register int i;for(i=0;x;x=fa[i=x])Splay(x),c[x][1]=i,up(x);}
        inline void mkrt(int x){access(x);Splay(x);Rev(x);}
        inline int fdrt(int x){access(x),Splay(x);for(;c[x][0];down(c[x][0]),x=c[x][0]);Splay(x);return x;}
        inline void Split(int x,int y){mkrt(x);access(y);Splay(y);}
    public:
        inline void init(int n){register int i;for(i=1;i<=n;++i) val[i]=X[i]=read();}
        void Link(int x,int y){mkrt(x);if(fdrt(y)!=x)fa[x]=y;}
        void Cut(int x,int y){Split(x,y);if(c[y][0]==x&&!c[x][1])c[y][0]=fa[x]=0,up(y);}
        inline int Query(int x,int y){if(x==y) return val[x];Split(x,y);return X[y];}
        inline void Modify(int x,int V){Splay(x);val[x]=V;up(x);}
    #undef MN
}T;
int main()
{
    register int n=read(),m=read(),opt,x;T.init(n);
    while(m--)
    {
        opt=read(),x=read();
        switch(opt)
        {
            case 0:printf("%d\n",T.Query(x,read()));break;
            case 1:T.Link(x,read());break;
            case 2:T.Cut(x,read());break;
            case 3:T.Modify(x,read());break;
        }
    }
}



Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10325245.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值