BZOJ 3091: 城市旅行 LCT

本文深入探讨了一种复杂的数据结构及其在动态更新场景下的高效算法实现,包括节点旋转、路径压缩等操作,并通过实例展示了如何在具体问题中应用这些技术进行数据管理和查询优化。

这个合并还是相当复杂的.     

code: 

#include <cstdio>  
#include <cstring> 
#include <string>
#include <map>
#include <algorithm>   
#define N 50005  
#define ll long long   
#define siz size       
#define ts tag
#define lson s[x].ch[0] 
#define rson s[x].ch[1]    
#define get(x) (s[s[x].f].ch[1]==x) 
#define Isr(x) (!(s[s[x].f].ch[0]==x||s[s[x].f].ch[1]==x))        
using namespace std;   

ll sqr(ll x) { return x*x;  }   
ll calc1(ll x) { return x*(x+1ll)/2; }   
ll calc2(ll x) { return x*(x+1ll)*(2ll*x+1ll)/6; }   
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;  }

namespace IO {      

    void setIO(string s) 
    {
        string in=s+".in"; 
        string out=s+".out"; 
        freopen(in.c_str(),"r",stdin); 
        freopen(out.c_str(),"w",stdout); 
    }     

};          
 
int sta[N]; 
map<int,int>con[N];        

struct node { 
    int ch[2],rev,f; 
    ll s0[2],s1[2],s2[2],tag,v,size; 
}s[N];          

void Pushup(int x) 
{           
    s[x].size=s[lson].size+s[rson].size+1;  
    s[x].s0[0]=s[lson].s0[0]+s[rson].s0[0]+s[x].v;     
    s[x].s1[0]=s[lson].s1[0]+s[rson].s1[0]+(s[rson].s0[0]+s[x].v)*(s[lson].size+1);        
    s[x].s2[0]=s[s[x].ch[0]].s2[0]+s[s[x].ch[1]].s2[0]+(s[s[x].ch[1]].s0[0]+s[x].v)*(s[s[x].ch[0]].size+1)*(s[s[x].ch[0]].size+1)+2ll*s[s[x].ch[1]].s1[0]*(s[s[x].ch[0]].size+1);      
    s[x].s0[1]=s[lson].s0[1]+s[rson].s0[1]+s[x].v;   
    s[x].s1[1]=s[rson].s1[1]+s[lson].s1[1]+(s[lson].s0[1]+s[x].v)*(s[rson].size+1);        
    s[x].s2[1]=s[s[x].ch[1]].s2[1]+s[s[x].ch[0]].s2[1]+(s[s[x].ch[0]].s0[1]+s[x].v)*(s[s[x].ch[1]].size+1)*(s[s[x].ch[1]].size+1)+2ll*s[s[x].ch[0]].s1[1]*(s[s[x].ch[1]].size+1);       
} 

void Up_tag(int x,ll v) 
{      
    s[x].v+=v;      
    s[x].tag+=v;  
    s[x].s0[0]+=s[x].size*v;        
    s[x].s0[1]+=s[x].size*v;          
    s[x].s1[0]+=calc1(s[x].size)*v; 
    s[x].s1[1]+=calc1(s[x].size)*v;        
    s[x].s2[0]+=calc2(s[x].size)*v;   
    s[x].s2[1]+=calc2(s[x].size)*v;   
}  

void Up_rev(int x) 
{  
    s[x].rev^=1; 
    swap(lson,rson); 
    swap(s[x].s0[0],s[x].s0[1]); 
    swap(s[x].s1[0],s[x].s1[1]),swap(s[x].s2[0],s[x].s2[1]);   
}  

void Pushdown(int x) 
{ 
    if(s[x].tag) 
    {
        if(lson) Up_tag(lson,s[x].tag); 
        if(rson) Up_tag(rson,s[x].tag); 
        s[x].tag=0; 
    }
    if(s[x].rev) 
    {
        if(lson) Up_rev(lson); 
        if(rson) Up_rev(rson);    
        s[x].rev=0;        
    }
}  

 
void rotate(int x) 
{    
    int old=s[x].f,fold=s[old].f,which=get(x);   
    if(!Isr(old)) s[fold].ch[s[fold].ch[1]==old]=x;     
    s[old].ch[which]=s[x].ch[which^1]; 
    if(s[old].ch[which]) s[s[old].ch[which]].f=old; 
    s[x].ch[which^1]=old,s[old].f=x,s[x].f=fold; 
    Pushup(old),Pushup(x); 
}

void Splay(int x) 
{     
    int v=0,u=x,fa; 
    for(sta[++v]=u;!Isr(u);u=s[u].f)  sta[++v]=s[u].f;  
    for(;v;--v)  Pushdown(sta[v]);   
    for(u=s[u].f;(fa=s[x].f)!=u;rotate(x))   
    {   
        if(s[fa].f!=u) 
            rotate(get(fa)==get(x)?fa:x);
    }
}           

void Access(int x) 
{
    for(int y=0;x;y=x,x=s[x].f)  
    {
        Splay(x);     
        rson=y; 
        Pushup(x);  
    }
}

void Make_Root(int x) 
{
    Access(x); 
    Splay(x); 
    Up_rev(x);   
}

void Link_Edge(int x,int y) 
{    
    Access(x),Splay(x); 
    Make_Root(y);   
    s[y].f=x;   
}    

void Cut_Edge(int x,int y) 
{     
    Make_Root(x),Access(y),Splay(y);    
    if(!s[x].ch[1]&&s[y].ch[0]==x)   s[y].ch[0]=s[x].f=0;            
    Pushup(y);           
}

void Split(int x,int y) 
{
    Make_Root(x),Access(y),Splay(y);      
}

int Find_Root(int x) 
{   
    while(s[x].f) x=s[x].f;  
    return x;   
}       

int main() 
{ 
    // IO::setIO("input"); 
    int i,j,n,m; 
    scanf("%d%d",&n,&m);       
    for(i=1;i<=n;++i)  scanf("%lld",&s[i].v),Pushup(i); 
    for(i=1;i<n;++i) 
    {
        int x,y; 
        scanf("%d%d",&x,&y); 
        Link_Edge(x,y); 
        con[x][y]=con[y][x]=1; 
    }
    for(i=1;i<=m;++i) 
    {
        int op,x,y,z; 
        scanf("%d",&op); 
        if(op==1) 
        {    
            scanf("%d%d",&x,&y);           
            if(!con[x][y])  continue;   
            else 
            {
                Cut_Edge(x,y);    
                con[x][y]=con[y][x]=0; 
            }
        }
        if(op==2) 
        {    
            scanf("%d%d",&x,&y); 
            if(Find_Root(x)==Find_Root(y))  continue;        
            else 
            {
                con[x][y]=con[y][x]=1;    
                Link_Edge(x,y);            
            }
        }
        if(op==3) 
        {
            scanf("%d%d%d",&x,&y,&z);   
            if(Find_Root(x)!=Find_Root(y)) continue;        
            Split(x,y);      
            Up_tag(y,(ll)z);                       
        }
        if(op==4)                          
        {
            scanf("%d%d",&x,&y);     
            if(Find_Root(x)!=Find_Root(y)) printf("-1\n"); 
            else 
            {
                Split(x,y);                    
                ll dn=s[y].size*(s[y].size+1)/2;                               
                ll up=(s[y].size+1ll)*s[y].s1[0]-s[y].s2[0];  
                ll g=gcd(up,dn); 
                printf("%lld/%lld\n",up/g,dn/g);    
            }   
        }
    }
    return 0;
}    

  

【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究(Matlab代码实现)内容概要:本文围绕【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究展开,重点介绍基于Matlab的代码实现方法。文章系统阐述了遍历理论的基本概念、动态模态分解(DMD)的数学原理及其与库普曼算子谱特性之间的内在联系,展示了如何通过数值计算手段分析非线性动力系统的演化行为。文中提供了完整的Matlab代码示例,涵盖数据驱动的模态分解、谱分析及可视化过程,帮助读者理解并复现相关算法。同时,文档还列举了多个相关的科研方向和技术应用场景,体现出该方法在复杂系统建模与分析中的广泛适用性。; 适合人群:具备一定动力系统、线性代数与数值分析基础,熟悉Matlab编程,从事控制理论、流体力学、信号处理或数据驱动建模等领域研究的研究生、博士生及科研人员。; 使用场景及目标:①深入理解库普曼算子理论及其在非线性系统分析中的应用;②掌握动态模态分解(DMD)算法的实现与优化;③应用于流体动力学、气候建模、生物系统、电力系统等领域的时空模态提取与预测;④支撑高水平论文复现与科研项目开发。; 阅读建议:建议读者结合Matlab代码逐段调试运行,对照理论推导加深理解;推荐参考文中提及的相关研究方向拓展应用场景;鼓励在实际数据上验证算法性能,并尝试改进与扩展算法功能。
本系统采用微信小程序作为前端交互界面,结合Spring Boot与Vue.js框架实现后端服务及管理后台的构建,形成一套完整的电子商务解决方案。该系统架构支持单一商户独立运营,亦兼容多商户入驻的平台模式,具备高度的灵活性与扩展性。 在技术实现上,后端以Java语言为核心,依托Spring Boot框架提供稳定的业务逻辑处理与数据接口服务;管理后台采用Vue.js进行开发,实现了直观高效的操作界面;前端微信小程序则为用户提供了便捷的移动端购物体验。整套系统各模块间紧密协作,功能链路完整闭环,已通过严格测试与优化,符合商业应用的标准要求。 系统设计注重业务场景的全面覆盖,不仅包含商品展示、交易流程、订单处理等核心电商功能,还集成了会员管理、营销工具、数据统计等辅助模块,能够满足不同规模商户的日常运营需求。其多店铺支持机制允许平台方对入驻商户进行统一管理,同时保障各店铺在品牌展示、商品销售及客户服务方面的独立运作空间。 该解决方案强调代码结构的规范性与可维护性,遵循企业级开发标准,确保了系统的长期稳定运行与后续功能迭代的可行性。整体而言,这是一套技术选型成熟、架构清晰、功能完备且可直接投入商用的电商平台系统。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值